我正在写CDI扩展程序。
在bean部署期间找出是否满足给定注入点的最简单方法是什么,如果不满足则删除它?
ProcessInjectionPoint
- 时间太早了,因为bean发现还没有完成,所以你不能告诉任何给定的InjectionPoint
,bean是否存在以满足它。
ProcessInjectionTarget
- 时间似乎也是错误的地方,因为虽然所有注射点都已经被读过但是现在没有办法去除它。
我需要一个事件,如果我可以确定注射点不会被满足,我可以从注射目标中移除注射点。
(背景:我正在以编程方式翻译Guice的com.google.inject.Inject
注释(其中包含optional
属性)。)
答案 0 :(得分:0)
我认为不可能这样做,至少不是这样。您的问题与CDI-45 issue中讨论的内容非常相似,可能值得在此处描述此用例。
对于您的情况,我遇到的一件事是使用@Inject Instance<MyBeanClass>
而不是经典注射。这允许您(在运行时)检测您是否具有满足IP的任何(或多个)bean。我对com.google.inject.Inject
及其optional
功能一无所知,但CDI Instance
似乎非常接近。
编辑:我的一位同事带来了一个可能对你有帮助的好主意。您仍将使用扩展程序,您将观察AfterBeanDiscovery
阶段。现在,您需要使用BeanManager
验证是否存在未满足的分辨率手动。为此,您可能会使用BM.resolve(BM.getBean())
。现在,如果您发现某些可选IP不满意,则需要致电AfterBeanDiscovery.addBean(myWrapperBean)
。其中myWrapperBean
是javax.enterprise.inject.spi.Bean
接口的impl(包装器)。这个包装器将是一个“虚拟生产者”,基本上返回null
。
这应该这样做,虽然它不适用于自定义bean ,例如bean通过AfterBeanDiscovery
添加,但我想这对你来说没问题。