焊接依赖注入问题
Weld dependency injection issues
我创建了一个 POJO 来为 RESTful API 的客户端保存上下文,类似于此(实际 class 是专有的)。
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 总是空的。这些接口在非 POJO classes 的其他地方使用并且被正确注入。它们是依赖对象,上面的代码出现在应用程序范围的 bean 中,所以我不能在那里注入 POJO。
我的问题是这样的; DI 在容器未实例化的对象中不可用吗?如果是这样,是否有任何方法可以告诉容器在具有依赖项的应用程序作用域 bean 中实例化我的依赖 POJO?如果不是,我做错了什么?我的容器是 Wildfly 11.
谢谢。
你做错了。
而不是使用 MyPOJO pojo = new MyPOJO();
你只是 @Inject MyPOJO pojo
到你想从中使用它的任何一个 (bean) class.
CDI/Weld 为您创建,并在创建时解决所有内部依赖项(在您的情况下为 obj1
和 obj2
)。
我看到你已经编辑了问题,所以这里是其他部分的答案。
首先,你可以将 @Dependent
注入 @ApplicationScoped
,如果你需要多个实例,你可以利用 Instance<MyPOJO>
并且在每个 get()
上你应该得到新的实例。 但请注意,您还需要确保处理这些物品!
is DI not available in objects not instantiated by the container?
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!
我创建了一个 POJO 来为 RESTful API 的客户端保存上下文,类似于此(实际 class 是专有的)。
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 总是空的。这些接口在非 POJO classes 的其他地方使用并且被正确注入。它们是依赖对象,上面的代码出现在应用程序范围的 bean 中,所以我不能在那里注入 POJO。
我的问题是这样的; DI 在容器未实例化的对象中不可用吗?如果是这样,是否有任何方法可以告诉容器在具有依赖项的应用程序作用域 bean 中实例化我的依赖 POJO?如果不是,我做错了什么?我的容器是 Wildfly 11.
谢谢。
你做错了。
而不是使用 MyPOJO pojo = new MyPOJO();
你只是 @Inject MyPOJO pojo
到你想从中使用它的任何一个 (bean) class.
CDI/Weld 为您创建,并在创建时解决所有内部依赖项(在您的情况下为 obj1
和 obj2
)。
我看到你已经编辑了问题,所以这里是其他部分的答案。
首先,你可以将 @Dependent
注入 @ApplicationScoped
,如果你需要多个实例,你可以利用 Instance<MyPOJO>
并且在每个 get()
上你应该得到新的实例。 但请注意,您还需要确保处理这些物品!
is DI not available in objects not instantiated by the container?
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!