假设我有一些带有注射的课程:
class MyBean {
@Inject
Helper helper;
// all sorts of data
}
并且这个类是以 CDI 容器不知道的方式创建的,例如反射、序列化或new
。在这种情况下helper
is null
因为CDI没有为我们初始化它。
有没有办法告诉 CDI“激活”bean 或至少它的注入?例如,就好像它是用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 解析注入点。这是很不寻常的,因为您处理生命周期的一部分(创建/销毁),同时要求 CDI 完成其余的工作。
就你而言,MyBean
类需要成为InjectionTarget,这就是您应该开始寻找的方式。为了触发注入,您将需要执行类似的操作(在创建期间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。然而,为此,您的问题没有提供足够的信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)