小编典典

@Inject仅对CDI容器创建的POJO有效吗?

java

我只想确认我完全了解CDI起作用的前提条件。如果我有A类:

public class A {
    @Inject private B b;
}

现在,当我使用以下方法实例化此类时:

A a = new A();

在这种情况下,Ab将为空。

但是如果我在另一个类中定义一个成员:

@Inject A a;

然后使用a,ab将被正确填充?

仅当需要注射的类也是由CDI容器创建的时,CDI才起作用吗?或者,如果使用普通实例化和新实例创建POJO时注入结果为空,那我会丢失什么(是的,我已经安装了beans.xml)?


阅读 223

收藏
2020-11-01

共1个答案

小编典典

尽管其他人正确地指出,在大多数情况下,DI容器不会将未实例化的依赖项注入bean中,但这并非完全正确。

Spring有一个很棒的功能,当您使用创建时,它将自动装配bean new A()。您只需要使用AspectJ并在@Configurable注释中标记bean即可

@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等而言至关重要。

2020-11-01