【发布时间】:2018-10-02 16:59:53
【问题描述】:
我有一个由 3rd 方代码实例化的类(它使用反射来创建对象。)我提供了他们接口的实现,他们创建了对象。在我的实现中,我想使用 CDI 来注入执行逻辑的服务。这样做的正确方法是什么?
public interface ThirdPartyInterface {
public void DoSomething();
}
public class InjectedService {
public void DoSomeLogic() { ... }
}
public class MyImplementation implements ThirdPartyInterface {
@Inject InjectedService service;
@Override
public void DoSomething() {
service.DoSomeLogic();
}
}
我最初认为这可以通过 CDI 的魔力实现,但发现我的服务对象为空。
到目前为止,我唯一想到的就是在构造函数中手动注入服务
public MyImplementation() {
CDI<Object> cdi = CDI.current();
service = cdi.select(InjectedService.class).get();
}
这是获取实例的正确/唯一/最佳方式吗?我将 Weld 用于我的 CDI 实施。
我还发现它在构造函数中也可以工作:
public MyImplementation() {
CDI<Object> cdi = CDI.current();
BeanManager bm = cdi.getBeanManager();
AnnotatedType<MyImplementation> myType = bm.createAnnotatedType(MyImplementation.class);
Set<Bean<?>> beans = bm.getBeans(MyImplementation.class);
Bean<?> bean = bm.resolve(beans);
@SuppressWarnings("unchecked")
CreationalContext<MyImplementation> cc = (CreationalContext<MyImplementation>)bm.createCreationalContext(bean);
bm.createInjectionTarget(myType).inject(this, cc);
}
【问题讨论】:
-
你几乎找到了。您要么需要故意让 CDI 为您提供托管版本,要么需要通过 JNDI 查找 bean。如果封闭 bean 是通过反射创建的,则与使用“new”相同,不会从 CDI 的角度进行管理。
标签: java dependency-injection cdi weld