Jboss CDI注射何时发生?

Jboss CDI注射何时发生?,jboss,wildfly,cdi,Jboss,Wildfly,Cdi,我正在与Wildfly服务器合作,我想知道注入实际上是什么时候发生的。是在需要的时候,还是有某种机制可以更早地解决依赖关系? 如果我使用annotation@Inject,我知道如果无法注入某些内容(歧义等),我会得到一个错误。这是否意味着注入是在部署时完成的?如果是这样,那么这与这个场景有什么关系:假设我有BeanOne注入BeanTwo,和BeanTwo注入beantree。这是否意味着此bean链将在部署时分配?如果我有比这更多的链,并且假设我的bean池被限制在一个较小的数目,比如2,会

我正在与Wildfly服务器合作,我想知道注入实际上是什么时候发生的。是在需要的时候,还是有某种机制可以更早地解决依赖关系?

如果我使用annotation
@Inject
,我知道如果无法注入某些内容(歧义等),我会得到一个错误。这是否意味着注入是在部署时完成的?如果是这样,那么这与这个场景有什么关系:假设我有
BeanOne
注入
BeanTwo
,和
BeanTwo
注入
beantree
。这是否意味着此bean链将在部署时分配?如果我有比这更多的链,并且假设我的bean池被限制在一个较小的数目,比如2,会发生什么?当没有足够的bean并且其中一些bean必须等待它们的依赖项时,如何在部署时完成这项工作?

这种情况与bean的编程查找不同:
CDI.current().select(MyStatelessBean.class).get()


甚至使用实例进行注入:
@injectinstancebean

您得到的错误通常来自所谓的验证阶段。这是在部署期间完成的,并不意味着将创建实际的bean

事实上,bean的创建通常是惰性的,特别是当代理处于活动状态时(例如,任何正常范围的bean)。这是特定于焊缝的,其他CDI实施不需要遵守,因为规范本身并不要求/禁止这样做

实际上,这意味着当您
@injectfoo-Foo您得到的实际上是一个代理对象。一个无状态的“shell”,知道如何在需要时获得所谓的上下文实例。上下文实例是在您第一次尝试使用该bean时(通常是在您第一次尝试调用该bean上的方法时)根据需要惰性地创建的

由于CDI的静态特性,在部署时,bean的所有依赖项都是已知的,并且可以进行验证,因此可以验证问题中的链,并且您将知道所有这些bean是否可用/不满意/不明确


至于动态分辨率,例如
实例
,则有所不同。CDI只能验证您的初始声明;在上面的示例中,类型为
Foo
的bean使用默认限定符。对
.select()
方法的任何后续调用都是在运行时完成的,因此您始终需要验证您刚才尝试选择的实例是否可用,因为您可以轻松选择不是bean的类型或具有无效限定符的bean类型。
实例
API为此提供了特殊的方法。

非常感谢。然后是CDI.current().select(MyStatelessBean.class.get();和'@injectinstancebean;同样的,第二个只是进行初始验证?那么联营呢?例如,如果我有'@Stateless'bean,我想将其作为某个长bean链的一部分注入(如上所述)。通过代理调用bean的代码是否必须等到容器从池中获得空闲bean?我在这里考虑了EJB的并发性。是的,
CDI.current()
基本上是为当前bean归档获取
实例的一种方法。至于池,CDI本身不知道池;这就是EJB特性,事实上,它甚至不需要存在(服务器可以以不同的方式解决)。EJB和CDI之间有一个集成层,允许您像使用CDI一样使用EJB bean;在WFLY中,真实EJB实例上有一种facade,Weld使用它来实现这一点。所以真正的问题更多的是关于WFLY如何处理池,或者它是否总是为您提供新实例。我不知道。