@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批注可用于其字段/方法):