假设我有一些关于注入(inject)的类(class):
class MyBean {
@Inject
Helper helper;
// all sorts of data
}
并且此类的创建方式是 CDI 容器不知道的,例如反射、序列化或 new
。在这种情况下 helper
是 null
因为CDI没有为我们初始化它。
有没有办法告诉 CDI“激活”bean 或至少它的注入(inject)?例如,就好像它是用 Instance<MyBean>#get
创建的?
现在我有一个 hack,可以执行以下操作:
class SomeClass {
@Inject
Instance<MyBean> beanCreator;
void activateBean() {
MyBean mybean = ... // reflection/serialization/new
MyBean realBean = beanCreator.get();
Helper proxy = realBean.getHelper();
mybean.setHelper(proxy);
beanCreator.destroy(realBean);
}
}
这看起来很糟糕,但它适用于我测试的所有内容。它只是显示了我想要的最终结果。
如果有必要,请使用 Wildfly 10.1。
最佳答案
首先,您使用MyBean
的方式不是CDI方式;事实上,您对所谓的非上下文对象进行操作。您正在做的是获取非 CDI 托管对象并要求 CDI 解析注入(inject)点。这是很不寻常的,因为您处理生命周期的一部分(创建/销毁),同时要求 CDI 完成其余的工作。
在您的情况下,MyBean
类需要变为 InjectionTarget
,这就是您应该开始寻找的方式。为了触发注入(inject),您需要执行以下操作(在创建 MyBean
期间):
// Create an injection target from your given class
InjectionTarget<MyBean> it = beanManager.getInjectionTargetFactory(beanManager.createAnnotatedType(MyBean.class))
.createInjectionTarget(null);
CreationalContext<MyBean> ctx = beanManager.createCreationalContext(null);
MyBean instance = new MyBean();
it.postConstruct(instance); // invoke @PostContruct
it.inject(instance, ctx); // trigger actual injection on the instance
请注意,这种方法通常很笨拙(因为很难使其工作和维护),最好将您的 MyBean
转变为真正的 CDI bean,并将整个生命周期管理留给CDI。然而,为此,您的问题没有提供足够的信息。
关于java - 如何告诉 CDI 容器 "activate"一个 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46026384/