CDI规范部分说:
调用
push()
不需要实现Contextual
[例如您的自定义Bean
]。但是,对于某些 Bean 作用域,在实例化和注入之间调用push()
有助于容器最大程度地减少客户端代理对象的使用(否则需要客户端代理对象才能允许循环依赖关系)。
长期以来,我一直在为现实世界的收获而苦苦挣扎。
如果我正在编写一个可移植扩展,并且在这样做时以编程方式将Bean
实例添加到容器中,那么始终从Bean
的create(CreationalContext)
方法中调用creationalContext.push(this)
是否有任何危害? "某些豆子范围"的含义是否有现实世界的翻译?
我正在寻找类似"如果你的Bean
要在Frobnicator
范围内,那么不要费心打电话给push()
,但如果它会在Fizzbuzz
范围内,那么你总是想这样做"。 显然,我也想了解这种建议背后的原因。
这可能是一个值得在CDI-dev邮件列表中提出的问题,包括实际答案和规范澄清请求。
正如您自己发现的那样,它的文档记录很差,因此我在这里声称的任何内容我都无法通过引用规范来支持,因此请持保留态度。
据我回忆,这主要用于注入中的循环依赖关系。如果你不这样做,那么你可以安全地忽略它。此外,Weld 为您解决了经典的循环注射问题,因此这仅与@Produces
真正相关,也许也与@PostConstruct
相关。
这样做的全部目的是在上下文中存储"部分创建"的实例,以满足分辨率并继续创建循环依赖的 bean。