焊接依赖性注入问题

时间:2018-06-22 00:48:52

标签: java dependency-injection jboss-weld wildfly-11

我创建了一个POJO,以保存RESTful API客户端的上下文,与此类似(实际类是专有的)。

class MyPOJO {

    @Inject
    public AnInjectedInterface obj1;

    @Inject
    public AnotherInjectedInterface obj2;

    public String data1;

    public int data2;

    public long data3;

}

我想这样使用它:

MyPOJO pojo = new MyPOJO();
pojo.data1 = "something";
pojo.data2 = 43;
pojo.data3 = 2875640;
pojo.obj1.someFunction();
pojo.obj2.anotherFunction("something");

如果执行此操作,则obj1和obj2始终为null。这些接口在非POJO类中的其他位置使用,并且已正确注入。它们是相关对象,并且上面的代码出现在应用程序范围的Bean中,因此我无法在其中注入POJO。

我的问题是这个; DI在容器未实例化的对象中不可用吗?如果是这样,是否有任何方法可以告诉容器在具有相关性的应用程序范围的bean中实例化我的相关POJO?如果没有,我在做什么错?我的容器是Wildfly 11。

谢谢。

1 个答案:

答案 0 :(得分:0)

您做错了。 无需使用MyPOJO pojo = new MyPOJO();,您只需@Inject MyPOJO pojo进入要从中使用它的任何( bean )类。

CDI / Weld为您完成创建,并同时解决所有内部依赖项(在您的情况下为obj1obj2)。

我看到您已经编辑了问题,所以这里是答案的其他部分。

首先,您可以将@Dependent注入到@ApplicationScoped中,如果需要多个实例,则可以利用Instance<MyPOJO>,并且在每个get()上都应该获取一个新实例。 但是请注意,您还需要确保处置这些对象!

  

DI在容器未实例化的对象中不可用吗?

默认情况下,CDI不会以任何方式处理它。但是,您可以自己对此类对象执行注入。为了保持精确,要注入的对象将作为InjectionTarget处理,并且您将需要BeanManager进行处理。大致是这样的(不是复制粘贴代码):

BeanManager beanManager; // assuming you have obtained BM somehow
CreationalContext<Object> ctx = beanManager.createCreationalContext(null);
InjectionTarget<MyPOJO> injectionTarget = beanManager
                    .getInjectionTargetFactory(beanManager.createAnnotatedType(MyPOJO.class)).createInjectionTarget(null);
injectionTarget.inject(myPojoInstance, ctx);
creationalContext = ctx; // store ctx so you can later on use it to dispose of the dependent instance!