[英]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注入其服务中的,或者根本上不涉及注入的。
我怎样才能做到这一点?
如果您使用的是Jersey 2,它将使用HK2作为其DI框架。 所有资源类在构造时都会经历DI生命周期。 而且构造函数注入不是问题。
使任意对象可注射的最基本方法(使用Jersey)是绑定到AbstractBinder
public class Binder extends AbstractBinder {
@Override
protected void configure() {
bind(EventSchedudlerDaoImpl.class).to(EventSchedulerDao.class);
}
}
然后在泽西岛注册活页夹
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(new Binder());
}
}
然后,您只需要通过在构造函数顶部添加@Inject
来声明注入点。
@Inject
public EventSchedulerService(EventSchedulerDao dao) {
this.dao = dao;
}
至于活页夹实现,绑定语法基本上读为
bind( Implementation ).to( Contract ).in( Scope );
bind
方法可以采用实例,也可以采用类。 提供实例时,范围自动为Singleton。
to
方法指定广告合同,这是可以在注入点声明的类型。 在这种情况下,仅接口EventSchedulerDao
可以用于注入点。 如果您没有界面,则可以
bindAsContract(EventSchedulerDao.class)
假设EventSchedulerDao
是实现类。
可用的范围是PerLookup
, RequestScoped
和Singleton
。 如果未指定,默认范围将是PerLookup
,这意味着将为每个注入点创建一个新的服务实例。 您应该已经知道Singleton
含义。 RequestScoped
意味着将为每个请求创建一个新实例,该实例可能与PerLookup
,因为服务可能会在整个请求生命周期的多个点被注入。
也可以看看:
您必须使用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
的配置类类,并使用bind(EventSchedulerDaoImpl.class).to(IEventScheduler.class)
注册接口的绑定到具体实现bind(EventSchedulerDaoImpl.class).to(IEventScheduler.class)
此处: https : //jersey.java.net/documentation/latest/ioc.html第23.1章)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.