我知道如何在Bean
期间将AfterBeanDiscovery
添加到CDI容器中。我的问题是我真正需要做的就是相当于添加一个新的生产者方法,相当于一个特别合格的参数。
也就是说,我想以某种方式以编程方式创建其中的几个:
@Produces
@SomeQualifier("x")
private Foo makeFoo(@SomeQualifier("x") final FooMaker fm) {
return fm.makeFoo();
}
... SomeQualifier
value
元素范围的域仅在AfterBeanDiscovery
时知道。换句话说,其他一些可移植扩展已在容器中安装了两个FooMaker
个实例:FooMaker
- 限定者 - @SomeQualifier("x")
和FooMaker
- 限定者 - {{1 }}。现在我需要做相当于制作两个生产者方法来匹配"它们。
@SomeQualifier("y")
不是一种选择;我希望这个解决方案在容器启动时进行,而不是在注射时进行。
我知道Nonbinding
的{{1}}方法,但是我必须通过数十行甚至数百行的体操来添加正确的限定符注释每个BeanManager
"可到达"从getProducerFactory
开始,我必须手工制作(以避免泛型问题)让我觉得我在这里远离人迹罕至的道路。
更新:在我的扩展程序中,我创建了一个AnnotatedParameter
方法,该方法返回AnnotatedMethod
,并且具有private static
参数。我已用手工Foo
将其封装在FooMaker
方法中报告AnnotatedMethod
等,并从SomeQualifier("x")
报告getAnnotations()
等。 } {' s SomeQualifier("x")
方法。然后我从AnnotatedParameter
获得getAnnotations()
并将其提供给我创建的新ProducerFactory
,我在其中使用它来实现BeanManager
和Bean
方法。一切都在编译等等。
(但是,Weld(特别是)会因为这种用法而爆炸,这让我觉得我在做Really Bad Things™。)