我只想确认我完全了解CDI起作用的前提条件。如果我有A类:
public class A { @Inject private B b; }
现在,当我使用以下方法实例化此类时:
A a = new A();
在这种情况下,Ab将为空。
但是如果我在另一个类中定义一个成员:
@Inject A a;
然后使用a,ab将被正确填充?
仅当需要注射的类也是由CDI容器创建的时,CDI才起作用吗?或者,如果使用普通实例化和新实例创建POJO时注入结果为空,那我会丢失什么(是的,我已经安装了beans.xml)?
尽管其他人正确地指出,在大多数情况下,DI容器不会将未实例化的依赖项注入bean中,但这并非完全正确。
Spring有一个很棒的功能,当您使用创建时,它将自动装配bean new A()。您只需要使用AspectJ并在@Configurable注释中标记bean即可。
new A()
@Configurable
@Configurable public class A { @Inject private B b; }
它实际上是一种很棒的功能,因为您可以执行Active Record样式的POJO,同时仍然要尊重您的DI(实际上是Spring Roo的方式)。
您还应该知道,使用Spring可以在通过AutowireCapableBeanFactory实例化bean之后以编程方式自动装配bean 。这通常是自动装配JUnit测试用例类的方式,因为JUnit创建了测试用例类。
是的,Spring不是CDI, 但从理论上讲,您可以@Configurable为CDI 编写自己的代码,或者可以采用CDI的方式完成上述操作。
话虽这么说,以上是一种复杂的功能(并且是一种hack),正如@JanGroth所提到的那样,容器的生命周期bean管理对于其CDI,Spring,Guice等而言至关重要。