与所使用的DI框架无关 - 对象链中的单个POJO总是会破坏DI机制。
伪代码示例:
class A {
@Inject
private B b;
}
class B {
private C c=new C();
}
class C {
@Inject
private D d;
}
C类中的注入将不起作用,因为B类中的new C()
会破坏托管对象链。
我们目前正在尝试通过逐步替换使用DI机制创建手动对象来改进我们的旧(非DI)项目。
那么如何将C
迁移到DI,甚至不关心A
和B
?
答案 0 :(得分:1)
你不能保持对构造函数的直接调用(没有字节码操作)。
这是一种将代码半自动重构为您可能需要的方法。
通常的IDE允许您从构造函数中创建/重构工厂方法。通过重构,对new C()
的所有调用都将转换为C.createInstance()
(或者调用工厂方法)。
然后更改工厂方法以从依赖注入框架中实际解析C。
答案 1 :(得分:0)
通常,如果您不想注入C
,请致电您的容器以解决C
:
C c = container.resolve(C.class);
或者您也可以注入C
,例如在调用构造函数时
或者像之前一样:
@Inject
private C c;
以下是CDI
的一些示例代码:
https://jaxenter.de/cdi-geht-fremd-dependency-injection-fur-javase-5039
使用以下方法解决所需对象:
UpdateCustomerController controller = (Controller) BeanProvider.getContextualReference("updateController", false);