@Inject仅适用于CDI容器创建的POJO?

时间:2012-08-22 19:44:05

标签: java java-ee java-ee-6 cdi

我只想确认我完全理解CDI工作的先决条件。如果我有A类:

public class A {
    @Inject private B b;
}

现在,当我使用:

实例化此类时
A a = new A();

在这种情况下,A.b将为空。

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

@Inject A a;

以后用a,a.b会正确填充吗?

CDI仅在需要注射的类也由CDI容器创建时才起作用吗?或者,如果使用普通的实例化创建一个POJO时,注射结果为null,我会错过什么(是的,我有beans.xml)?

5 个答案:

答案 0 :(得分:9)

  

CDI仅在需要注射的课程也适用时才有效   由CDI容器创建?

是的,几乎就是这样。 ManagedBean的生命周期由容器控制,不应该使用new关键字进行实例化(BTW:EJB和Spring bean也是如此)。如果您需要创建一个新的ManagedBean,您可能希望使用producer method

答案 1 :(得分:4)

虽然其他人已经正确地说过,在大多数情况下,DI容器不会将依赖关系注入到bean中,但是他们没有实例化它并不完全正确。

Spring有一个很棒的功能,可以在使用new A()创建bean时自动装配bean。 您只需使用AspectJ and mark your bean with the @Configurable annotation

@Configurable
public class A {
    @Inject private B b;
}

它实际上是一个很棒的功能,因为你可以做主动记录风格的POJO,同时仍然尊重你的DI(事实上它是Spring Roo如何做到的)。

您还应该知道,使用Spring,您可以在使用AutowireCapableBeanFactory实例化之后以编程方式自动装配bean。这就是它通常自动装配JUnit测试用例类的方法,因为JUnit创建了测试用例类。

是Spring不是CDI ,但从理论上讲,您可以为CDI编写自己的@Configurable,或者可能采用CDI方式执行上述操作。

据说上面的内容是一种复杂的功能(和一种黑客攻击),正如@JanGroth所提到的那样,lifecycle bean management of the container对于CDI,Spring,Guice等是否至关重要。

答案 2 :(得分:1)

是的,@ Inject仅在容器内部工作,因为它是在方法调用上使用拦截器完成的。当容器创建一个bean时,它会在执行注入的拦截器中进行封装,在使用 new 进行实例化的情况下,在bean方法调用期间不会调用拦截器,也不会有注入。

答案 3 :(得分:1)

您可以使用Apache DeltaSpike中的BeanProvider.injectFields(myObject);

答案 4 :(得分:0)

以下是类成为托管bean所需的条件(因此,@ Inject注释可用于其字段/方法):

http://docs.oracle.com/javaee/6/tutorial/doc/gjfzi.html