Java @只为CDI容器创建的POJO注入?

Java @只为CDI容器创建的POJO注入?,java,jakarta-ee,java-ee-6,cdi,Java,Jakarta 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容器创建的情况下才起作用?或者,如果在使用new(是的,我得到了beans.xml)的普通实例化创建POJO时注

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

public class A {
    @Inject private B b;
}
现在,当我使用以下命令实例化该类时:

A a = new A();
在这种情况下,A.b将为空

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

@Inject A a;
以后使用a,a.b是否会正确填充


CDI是否仅在需要注入的类也是由CDI容器创建的情况下才起作用?或者,如果在使用new(是的,我得到了beans.xml)的普通实例化创建POJO时注入结果为空,那么我缺少什么呢?

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

CDI是否仅在需要注入的类也被激活时才起作用 由CDI容器创建


是的,差不多就是这样。
ManagedBean
的生命周期由容器控制,不应使用
new
关键字实例化(顺便说一句:EJB和Springbean也是如此)。如果您需要创建一个新的ManagedBean,您可能需要使用一个。

是的,@Inject只在容器中工作,因为它是在方法调用中使用拦截器完成的。当容器创建一个bean时,它将其包装在执行注入的拦截器中,如果使用new进行实例化,则在bean方法调用期间不会调用拦截器,也不会有注入。

虽然其他人正确地指出,在大多数情况下,DI容器不会将依赖项注入到bean中,但他们没有实例化,这并不完全正确

Spring有一个很好的特性,当您使用
newa()
创建bean时,它会自动连接bean。 你只需要使用

这实际上是一个很棒的特性,因为你可以在仍然尊重你的DI的同时做活动记录风格的POJO(事实上SpringRoo就是这样做的)

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

是的,Spring不是CDI,但从理论上讲,您可以为CDI编写自己的
@可配置的
,或者可能有一种CDI方式来实现上述功能


如上所述,这是一种复杂的功能(也是一种黑客行为),正如@JanGroth所提到的,了解其CDI、Spring、Guice等功能是至关重要的。

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

注入是否发生在拦截器中?或者它是在容器创建bean时发生的?我想是后者。如果您使用的是构造函数注入,则必须是后者。不,@Inject不适用于拦截器-它适用于代理(主要是出于性能原因)。查看优秀的文档以了解完整情况。啊,现在我开始理解为什么会有生产者方法。这并不完全是真的,新方法不会注入。您可以使用spring创建
new
inject:我希望绕过spring,坚持使用纯JEE6进行CDI。但我认为CDI非常有限。例如,如果我有一个servlet上下文,我不能注入任何由CDI管理的内容,因为servlet类不是由CDI容器创建的。我想这就是Spring有用的地方。@sebi-关于您对CDI和servlet容器的评论。你的理解是错误的。您可以很高兴地将CDIBean注入到带有JavaEE6的servlet中。servlet或servlet过滤器是CDI容器的“托管”对象。这也适用于JAX-RS/Jersey资源,因此您也可以将其注入其中。您还可以将EJB注入servlet。@AdamGreen-据我所知,OP完全不知道容器接管了bean的生命周期。这就是为什么我仍然认为,
new Foo()
对于依赖注入的hello world尝试不是一个好主意——尽管大多数容器(包括CDI)都提供了绕过此限制的方法。嗯,OP询问了CDI,最终接受的答案描述了Spring的特性。韦瑞德:)@jangroth我不认为我会被标记为正确的。我只是把我的答案放在万一有人想用
new*()
做DI的地方。。。我也有点猜测他真的想要那样,但也许我只是让他更困惑了。你总是可以-1我的帖子:)不用担心,伙计,我非常高兴+1你提出了这个有趣的方面:)问题是几乎所有的答案都是正确的。所以我选择了一个,它给了我最多的洞察力。
@Configurable
public class A {
    @Inject private B b;
}