带参数的 Jersey 构造函数
Jersey constructor with parameters
我想在用 Jersey 开发的 RESTful 服务中使用 DAO,因此应该通过服务的构造函数注入 DAO 实现:
@Path("eventscheduler)
public class EventSchedulerService {
private IEventSchedulerDao dao;
public EventSchedulerService(IEventSchedulerDao dao) { this.dao = dao; }
}
但是,我知道 Jersey 需要默认构造函数来正确设置所有内容。一段时间以来,我一直在尝试弄清楚如何做到这一点,但令人惊讶的是,这似乎是一种罕见的情况,我想知道人们如何将 DAO 注入到他们的服务中,或者一般情况下如何处理注入。
我该怎么做?
您必须使用 javax.inject.Inject
.
注释 class 构造函数(或 属性 本身)
import javax.inject.Inject;
class EventSchedulerResource {
private final IEventSchedulerDao dao;
@Inject
public EventSchedulerResource(IEventSchedulerDao dao) {
this.dao = dao;
}
// ...
}
如果 IEventScheduler
是接口,您必须创建扩展 org.glassfish.jersey.server.ResourceConfig
的配置 class class 并使用 [= 注册接口到具体实现的绑定14=](参见此处:https://jersey.java.net/documentation/latest/ioc.html 第 23.1 章)
如果您使用的是 Jersey 2,它会使用 HK2 作为 DI 框架。所有资源 classes 在构建时都会经历 DI 生命周期。而且构造函数注入不是问题。
使任意对象可注入的最基本方法(使用 Jersey)是绑定 AbstractBinder
public class Binder extends AbstractBinder {
@Override
protected void configure() {
bind(EventSchedudlerDaoImpl.class).to(EventSchedulerDao.class);
}
}
然后用 Jersey 注册活页夹
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(new Binder());
}
}
然后你只需要通过在构造函数之上添加@Inject
来声明注入点。
@Inject
public EventSchedulerService(EventSchedulerDao dao) {
this.dao = dao;
}
就binder实现而言,绑定语法基本上是
bind( Implementation ).to( Contract ).in( Scope );
bind
方法可以采用实例,也可以采用 class。当你提供一个实例时,Scope 自动为 Singleton。
to
方法指定广告合约,这是可以在注入点声明的类型。在这种情况下,只有接口 EventSchedulerDao
可以用于注入点。如果你没有界面,你可以这样做
bindAsContract(EventSchedulerDao.class)
假设 EventSchedulerDao
是实施 class。
可用的范围是 PerLookup
、RequestScoped
和 Singleton
。如果未指定,默认范围将为 PerLookup
,这意味着将为每个注入点创建一个新的服务实例。你应该已经知道 Singleton
是什么意思了。 RequestScoped
意味着将为每个请求创建一个新实例,这可能与 PerLookup
不同,因为该服务可能会在整个请求生命周期中的多个点注入。
另请参阅:
- Dependency injection with Jersey 2.0
- Custom Injection and Lifecycle Management
- hk2 标记的问题。其中很多都与泽西岛有关。
我想在用 Jersey 开发的 RESTful 服务中使用 DAO,因此应该通过服务的构造函数注入 DAO 实现:
@Path("eventscheduler)
public class EventSchedulerService {
private IEventSchedulerDao dao;
public EventSchedulerService(IEventSchedulerDao dao) { this.dao = dao; }
}
但是,我知道 Jersey 需要默认构造函数来正确设置所有内容。一段时间以来,我一直在尝试弄清楚如何做到这一点,但令人惊讶的是,这似乎是一种罕见的情况,我想知道人们如何将 DAO 注入到他们的服务中,或者一般情况下如何处理注入。
我该怎么做?
您必须使用 javax.inject.Inject
.
import javax.inject.Inject;
class EventSchedulerResource {
private final IEventSchedulerDao dao;
@Inject
public EventSchedulerResource(IEventSchedulerDao dao) {
this.dao = dao;
}
// ...
}
如果 IEventScheduler
是接口,您必须创建扩展 org.glassfish.jersey.server.ResourceConfig
的配置 class class 并使用 [= 注册接口到具体实现的绑定14=](参见此处:https://jersey.java.net/documentation/latest/ioc.html 第 23.1 章)
如果您使用的是 Jersey 2,它会使用 HK2 作为 DI 框架。所有资源 classes 在构建时都会经历 DI 生命周期。而且构造函数注入不是问题。
使任意对象可注入的最基本方法(使用 Jersey)是绑定 AbstractBinder
public class Binder extends AbstractBinder {
@Override
protected void configure() {
bind(EventSchedudlerDaoImpl.class).to(EventSchedulerDao.class);
}
}
然后用 Jersey 注册活页夹
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(new Binder());
}
}
然后你只需要通过在构造函数之上添加@Inject
来声明注入点。
@Inject
public EventSchedulerService(EventSchedulerDao dao) {
this.dao = dao;
}
就binder实现而言,绑定语法基本上是
bind( Implementation ).to( Contract ).in( Scope );
bind
方法可以采用实例,也可以采用 class。当你提供一个实例时,Scope 自动为 Singleton。
to
方法指定广告合约,这是可以在注入点声明的类型。在这种情况下,只有接口 EventSchedulerDao
可以用于注入点。如果你没有界面,你可以这样做
bindAsContract(EventSchedulerDao.class)
假设 EventSchedulerDao
是实施 class。
可用的范围是 PerLookup
、RequestScoped
和 Singleton
。如果未指定,默认范围将为 PerLookup
,这意味着将为每个注入点创建一个新的服务实例。你应该已经知道 Singleton
是什么意思了。 RequestScoped
意味着将为每个请求创建一个新实例,这可能与 PerLookup
不同,因为该服务可能会在整个请求生命周期中的多个点注入。
另请参阅:
- Dependency injection with Jersey 2.0
- Custom Injection and Lifecycle Management
- hk2 标记的问题。其中很多都与泽西岛有关。