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

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

public class A { @Inject private B b; } 

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

 A a = new A(); 

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

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

 @Inject A a; 

以后使用a,ab会被正确填充吗?

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

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

Spring有一个很棒的function,当你使用new A()创建它时会自动assemblybean。 您只需使用AspectJ并使用@Configurable注释标记您的bean 。

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

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

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

是的Spring不是CDI,但从理论上讲,你可以为CDI编写自己的@Configurable ,或者可能有CDI的方式来做上述事情。

可以说上面是一个复杂的function(和一种黑客攻击),正如@JanGroth所提到的那样,无论是CDI,Spring,Guice等, 容器的生命周期bean管理都至关重要。

CDI仅在需要注射的类也由CDI容器创建时才起作用吗?

是的,这就是它。 ManagedBean的生命周期由容器控制,永远不应该使用new关键字进行实例化(BTW:EJB和Spring bean也是如此)。 如果需要创建新的ManagedBean,则可能需要使用producer方法 。

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

您可以使用BeanProvider.injectFields(myObject); 来自Apache DeltaSpike 。

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

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