java - Dropwizard HK2注入(inject)

标签 java dependency-injection jersey dropwizard hk2

我是使用 dropwizard 的新手。目前我正在尝试实现 HK2 依赖注入(inject)。这在资源内部工作得很好,但在资源外部不起作用。这是我正在做的:

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);
        }
    });

我创建了我希望可注入(inject)的类的实例并绑定(bind)它们。

在我的资源中,注入(inject)有效:

@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;

所有这些变量都填充了正确类的实例。

问题是:ContentModuleManager 也应该通过注入(inject)获得其中一些类:

public class ContentModuleManager {

@Inject
private ContentModuleDAO contentModuleDAO;

@Inject
private ProposalManager proposalManager;

@Inject
private ModuleServedDAO moduleServedDAO;

但是那些都是空的。有人可以向 dropwizard noob 解释为什么会发生这种情况以及我该如何解决这个问题? :D

谢谢!

最佳答案

如果您打算自己实例化服务,那么它不会经历 DI 生命周期,也永远不会被注入(inject)。如果您只是将服务注册为类,则可以让容器创建服务

bind(ContentModuleManager.class)
    .to(ContentModuleManager.class)
    .in(Singleton.class);

另一方面,如果您自己创建所有服务并且所有服务都可用,为什么不干脆不使用 DI 容器呢?只需通过构造函数传递所有服务即可。无论您是使用构造函数注入(inject)1 还是手动传递构造函数,通过构造函数获取服务无论如何都是一种很好的做法,因为它可以更轻松地测试服务。


1 - 构造函数注入(inject)

private Service service;

@Inject
public OtherService(Service service) {
   this.service = service;
}

关于java - Dropwizard HK2注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48662531/

相关文章:

java - 根据 JPA 2 中的子参数过滤父级

java - Jax-rs,Jersey 在启动时初始化方法

java - 警告 : The (sub)resource method contains empty path annotation

java - 如何使用 JAXB 将 XML 转换为对象

java - 尝试清空 JTable 时出现 ArrayIndexOutOfBoundsException

java - 如何在 Eclipse 中使用 PDFBox?是否打包成jar文件?

java - Spring 3 中通过注解注入(inject)与通过 XML 文件注入(inject)的对比。与继承相关的限制

c# - 在何处使用依赖注入(inject)注册上下文

c# - UnityContainer 为一个接口(interface)解析所有类型

java - UTF-8 字节 [] 到字符串