当前位置: 首页 > 面试题库 >

Dropwizard HK2注射剂

许嘉福
2023-03-14
问题内容

我在与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容器呢?只需通过构造函数传递所有服务即可。无论是使用构造html" target="_blank">函数注入 1
还是手动传递构造函数,通过构造函数获取服务始终是一种好习惯,因为它可以简化对服务的测试。

1-构造函数注入

private Service service;

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


 类似资料:
  • 我是Guice的新手,所以我试图理解AssistedInject。我有一个非常简单的项目: 我要注入的类: 带辅助注射的类别: 工厂 主类: 但它仍然不起作用,我不明白,我错在哪里?

  • 我在Spring服务中使用推土机。如何使用JUnit和Mockito将注入到已测试的服务中? 我的java类(如果简化)看起来像: 使用JUnit 4 Mockito Hamcrest的测试类如下所示: 问题在于模拟的Dozer实例没有按预期映射对象——默认情况下,Mockito存根返回空或空对象。如果我从测试中删除注释,它会抛出NPE!

  • 我有一个错误,当我注入feignClient接口在我的服务。这是我使用的Spring引导和Spring云版本: 组织。springframework。启动:spring启动程序父级:2.0.6。发布spring云版本:Finchley。SR2 但是当我在我的类服务中创建一个虚假客户端bean时,它就工作了。 创建客户外部客户端: 我把这个假冒的客户注入军队 输出

  • 此代码正在触发错误 无效的sql对象。 从文档中我觉得表中的任何对象都是sql对象<这里怎么了? 在Oracle 10G中考虑以下函数 在10G上下文中考虑以下函数 我得到了一个错误的无效对象 我的桌子就像 此表位于“测试”模式中,我与SCOTT有联系,SCOTT有“测试时授予选择权”。测试表到scott's 我还是会出错 ERR_INVALID_OBJECT

  • 注入是将依赖注入对象的过程。 可选注入意味着在存在时注入依赖项。 方法和场注入可以是可选的,并且如果不存在依赖性,则应该具有一些默认值。 请参阅下面的示例。 例子 (Example) 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.

  • 本文向大家介绍PHP 二传手注射,包括了PHP 二传手注射的使用技巧和注意事项,需要的朋友参考一下 示例 设置程序也可以注入依赖项。 当类的核心功能不依赖于依赖项来工作时,这尤其有趣。 在这里,唯一需要的依赖关系就是DatabaseConnection它的构造函数。该Logger依赖性是可选的,因此并不需要成为构造的一部分,使类更容易使用。 请注意,使用setter注入时,最好扩展功能而不是替换它