在CDI扩展中,什么是判断注入点是否满足的最简单方法?

时间:2016-11-13 00:25:58

标签: cdi

我正在写CDI扩展程序。

在bean部署期间找出是否满足给定注入点的最简单方法是什么,如果不满足则删除它?

ProcessInjectionPoint - 时间太早了,因为bean发现还没有完成,所以你不能告诉任何给定的InjectionPoint,bean是否存在以满足它。

ProcessInjectionTarget - 时间似乎也是错误的地方,因为虽然所有注射点都已经被读过但是现在没有办法去除它。

我需要一个事件,如果我可以确定注射点不会被满足,我可以从注射目标中移除注射点。

(背景:我正在以编程方式翻译Guice的com.google.inject.Inject注释(其中包含optional属性)。)

1 个答案:

答案 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)。其中myWrapperBeanjavax.enterprise.inject.spi.Bean接口的impl(包装器)。这个包装器将是一个“虚拟生产者”,基本上返回null

这应该这样做,虽然它不适用于自定义bean ,例如bean通过AfterBeanDiscovery添加,但我想这对你来说没问题。