【问题标题】:CDI: Obtaining InjectionPoint when producing a scoped beanCDI:在生成作用域 bean 时获取 InjectionPoint
【发布时间】:2015-02-25 15:39:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: java cdi


    【解决方案1】:

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

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

    你有两个该 bean 的注入点:

    @Inject
    String myString1;
    
    @Inject
    String myString2;
    

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

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

    【讨论】:

    • 嗯,我在这里可能是错的,但据我了解,范围仅指定注入 bean 的生命周期。在这种情况下,生产者将在生命周期中为每个注入点调用一次,但不需要为每个注入点返回相同的 bean。我将为此编写一个测试用例,并发布结果。
    • 事实证明你是对的;生产者方法只被调用一次。在这种情况下,我很好奇它是否可以改变行为。我看到 Omnifaces 似乎已经解决了这个问题,请参阅 github.com/omnifaces/omnifaces/blob/master/src/main/java/org/…
    • 在这个例子中,bean的范围是@Dependent,由getScope方法返回:github.com/omnifaces/omnifaces/blob/master/src/main/java/org/…
    猜你喜欢
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2022-10-12
    相关资源
    最近更新 更多