Dropwizard HK2注入
Dropwizard HK2 injection
我是使用 dropwizard 的新手。目前我正在尝试实施 HK2 依赖注入。这在资源内部工作得很好,但在资源外部不起作用。这是我正在做的事情:
Client client = new JerseyClientBuilder(environment).using(configuration.getJerseyClientConfiguration()).build("contentmoduleservice");
//DAOs
ContentModuleDAO contentModuleDAO = new ContentModuleDAO(hibernate.getSessionFactory());
ModuleServedDAO moduleServedDAO = new ModuleServedDAO(hibernate.getSessionFactory());
//Manager
ContentModuleManager moduleManager = new ContentModuleManager();
EntityTagManager eTagManager = new EntityTagManager();
ProposalManager proposalManager = new ProposalManager(client, configuration);
environment.jersey().register(new AbstractBinder() {
@Override
protected void configure() {
bind(eTagManager).to(EntityTagManager.class);
bind(contentModuleDAO).to(ContentModuleDAO.class);
bind(moduleServedDAO).to(ModuleServedDAO.class);
bind(proposalManager).to(ProposalManager.class);
bind(moduleManager).to(ContentModuleManager.class);
}
});
我创建了 classes 的实例,我想注入并绑定它们。
在我的资源中,注入有效:
@Api
@Path("/api/contentmodule")
public class ContentModuleResource {
static final Logger LOG = LoggerFactory.getLogger(ContentModuleResource.class);
static final int MAX_PROPOSALS_PER_MODULE = 10;
@Inject
private ContentModuleDAO contentModuleDAO;
@Inject
private EntityTagManager eTagManager;
@Inject
private ProposalManager proposalManager;
@Inject
private ContentModuleManager contentModuleManager;
所有这些变量都用一个Instance来填充吧class.
问题是:ContentModuleManager 也应该通过注入获得其中一些 classes:
public class ContentModuleManager {
@Inject
private ContentModuleDAO contentModuleDAO;
@Inject
private ProposalManager proposalManager;
@Inject
private ModuleServedDAO moduleServedDAO;
但这些都是空的。有人可以向 dropwizard noob 解释为什么会发生这种情况以及我该如何解决这个问题? :D
谢谢!
如果您打算自己实例化服务,那么它不会经历 DI 生命周期,也永远不会被注入。如果您只是将服务注册为 class
,则可以让容器创建服务
bind(ContentModuleManager.class)
.to(ContentModuleManager.class)
.in(Singleton.class);
另一方面,如果您自己创建所有服务并且所有服务都可用,为什么不完全不使用 DI 容器呢?只需通过构造函数传递所有服务即可。无论您是使用构造函数注入1还是手动通过构造函数传递,无论如何通过构造函数获取服务都是很好的做法,因为它允许更容易服务测试。
1 - 构造函数注入
private Service service;
@Inject
public OtherService(Service service) {
this.service = service;
}
我是使用 dropwizard 的新手。目前我正在尝试实施 HK2 依赖注入。这在资源内部工作得很好,但在资源外部不起作用。这是我正在做的事情:
Client client = new JerseyClientBuilder(environment).using(configuration.getJerseyClientConfiguration()).build("contentmoduleservice");
//DAOs
ContentModuleDAO contentModuleDAO = new ContentModuleDAO(hibernate.getSessionFactory());
ModuleServedDAO moduleServedDAO = new ModuleServedDAO(hibernate.getSessionFactory());
//Manager
ContentModuleManager moduleManager = new ContentModuleManager();
EntityTagManager eTagManager = new EntityTagManager();
ProposalManager proposalManager = new ProposalManager(client, configuration);
environment.jersey().register(new AbstractBinder() {
@Override
protected void configure() {
bind(eTagManager).to(EntityTagManager.class);
bind(contentModuleDAO).to(ContentModuleDAO.class);
bind(moduleServedDAO).to(ModuleServedDAO.class);
bind(proposalManager).to(ProposalManager.class);
bind(moduleManager).to(ContentModuleManager.class);
}
});
我创建了 classes 的实例,我想注入并绑定它们。
在我的资源中,注入有效:
@Api
@Path("/api/contentmodule")
public class ContentModuleResource {
static final Logger LOG = LoggerFactory.getLogger(ContentModuleResource.class);
static final int MAX_PROPOSALS_PER_MODULE = 10;
@Inject
private ContentModuleDAO contentModuleDAO;
@Inject
private EntityTagManager eTagManager;
@Inject
private ProposalManager proposalManager;
@Inject
private ContentModuleManager contentModuleManager;
所有这些变量都用一个Instance来填充吧class.
问题是:ContentModuleManager 也应该通过注入获得其中一些 classes:
public class ContentModuleManager {
@Inject
private ContentModuleDAO contentModuleDAO;
@Inject
private ProposalManager proposalManager;
@Inject
private ModuleServedDAO moduleServedDAO;
但这些都是空的。有人可以向 dropwizard noob 解释为什么会发生这种情况以及我该如何解决这个问题? :D
谢谢!
如果您打算自己实例化服务,那么它不会经历 DI 生命周期,也永远不会被注入。如果您只是将服务注册为 class
,则可以让容器创建服务bind(ContentModuleManager.class)
.to(ContentModuleManager.class)
.in(Singleton.class);
另一方面,如果您自己创建所有服务并且所有服务都可用,为什么不完全不使用 DI 容器呢?只需通过构造函数传递所有服务即可。无论您是使用构造函数注入1还是手动通过构造函数传递,无论如何通过构造函数获取服务都是很好的做法,因为它允许更容易服务测试。
1 - 构造函数注入
private Service service;
@Inject
public OtherService(Service service) {
this.service = service;
}