java-Dropwizard HK2注入

我在与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);
        }
    });

我创建要注入的类的实例并绑定它们.

在我的资源中,注入工作:

@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还应该通过注入来获取其中一些类:

public class ContentModuleManager {

@Inject
private ContentModuleDAO contentModuleDAO;

@Inject
private ProposalManager proposalManager;

@Inject
private ModuleServedDAO moduleServedDAO;

但是这些都是空的.有人可以解释为什么这个问题会发生,我该如何解决? :d

谢谢!

解决方法:

如果您要自己实例化服务,那么它将不会经历DI生命周期,并且永远不会被注入.如果您只是将服务注册为类,则可以让容器创建服务

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

另一方面,如果您自己创建所有服务,并且所有服务都可用,那么为什么不根本不使用DI容器呢?只需通过构造函数传递所有服务即可.无论您是使用构造函数injection1还是手动传递构造函数,通过构造函数获取服务始终是一种好习惯,因为它可以简化对服务的测试.

1-构造函数注入

private Service service;

@Inject
public OtherService(Service service) {
   this.service = service;
}
上一篇:python全栈开发day53-mysql


下一篇:java-Jersey:是否可以在@DefaultValue()批注中指定多个值