dab*_*aba 1 java rest dao dependency-injection jersey
我想在使用Jersey开发的RESTful服务中使用DAO,因此应该通过服务的构造函数注入DAO实现:
@Path("eventscheduler)
public class EventSchedulerService {
private IEventSchedulerDao dao;
public EventSchedulerService(IEventSchedulerDao dao) { this.dao = dao; }
}
Run Code Online (Sandbox Code Playgroud)
但是,我知道Jersey希望默认构造函数能够正确设置所有内容.我一直试图弄清楚如何做一段时间,但令人惊讶的是,这似乎是一个不常见的情况,我想知道人们如何将DAO注入他们的服务,或者根本不用处理注射.
我怎样才能做到这一点?
如果您使用的是Jersey 2,它使用HK2作为DI框架.所有资源类在构建时都会经历DI生命周期.构造函数注入不是问题.
最基本的方式(使用Jersey)使任意对象可注入,是绑定在 AbstractBinder
public class Binder extends AbstractBinder {
@Override
protected void configure() {
bind(EventSchedudlerDaoImpl.class).to(EventSchedulerDao.class);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在泽西岛注册活页夹
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(new Binder());
}
}
Run Code Online (Sandbox Code Playgroud)
然后你只需要@Inject在构造函数的顶部添加声明注入点.
@Inject
public EventSchedulerService(EventSchedulerDao dao) {
this.dao = dao;
}
Run Code Online (Sandbox Code Playgroud)
就绑定器实现而言,绑定语法基本上如下所示
bind( Implementation ).to( Contract ).in( Scope );
Run Code Online (Sandbox Code Playgroud)
该bind方法可以采用实例,也可以采用类.当您提供实例时,Scope将自动为Singleton.
该to方法指定广告合约,该合约是可在注入点声明的类型.在这种情况下,只有接口EventSchedulerDao可用于注入点.如果您没有界面,您可以这样做
bindAsContract(EventSchedulerDao.class)
Run Code Online (Sandbox Code Playgroud)
假设EventSchedulerDao是实现类.
可用的范围是PerLookup,RequestScoped和Singleton.如果未指定,则默认范围将是PerLookup,这意味着将为每个注入点创建服务的新实例.你应该已经知道了什么Singleton意思.RequestScoped表示将为每个请求创建一个新实例,该实例可能不同PerLookup,因为服务可能会在请求生命周期中的多个点注入.
也可以看看:
| 归档时间: |
|
| 查看次数: |
4010 次 |
| 最近记录: |