CDI:在生成范围bean时获取InjectionPoint

CDI: Obtaining InjectionPoint when producing a scoped bean

当您的生产者方法正在生成作用域 bean 时,获取 InjectionPoint 的最简单方法是什么?出于某种原因,规范只允许在生成作用域 bean 时注入 InjectionPoint。 有没有一种简单的方法可以做到这一点,或者有某种 bolg 条目或教程吗?

为了澄清,这是我喜欢做的,但规范禁止的:

@Produces
@RequestScoped
@MyAnnotation    
private MyObject produce(InjectioPoint ip){
....
}

让我们想象一下你想做的事情是可能的。您定义了一个 @ApplicationScoped bean:

@Produces
@ApplicationScoped
String produceMyString(InjectionPoint ip) {}

并且您有两个用于该 bean 的注入点:

@Inject
String myString1;

@Inject
String myString2;

由于 bean 是 ApplicationScoped,生产者方法只会被调用一次。这导致了不可能的结论,因为容器无法选择将哪个注入点用作生产者方法的参数。

这解释了为什么访问 InjectionPoint 元数据会强制 bean 成为 @Dependent。换句话说,CDI 规范禁止这种行为,因为它会导致矛盾,而不是因为任意选择。