Java 通过Producer类将RequestScoped CDIBean注入到应用程序范围的CDIBean中

Java 通过Producer类将RequestScoped CDIBean注入到应用程序范围的CDIBean中,java,dependency-injection,cdi,java-ee-7,Java,Dependency Injection,Cdi,Java Ee 7,本文解释了您可以将RequestScoped bean注入到ApplicationScoped bean中,客户端代理将在请求期间指向正确的实例: 当使用一个单独的生产者类进行额外处理并生成RequestScoped bean时,这是如何工作的? 在部署到应用服务器时,由于不明确的依赖关系,我得到了一个DeploymentException,因为托管bean和我的producer方法都符合条件。事实上,它是有效的。在这种情况下,只要需要,CDI impl就会执行您的@products方法 您得

本文解释了您可以将RequestScoped bean注入到ApplicationScoped bean中,客户端代理将在请求期间指向正确的实例:

当使用一个单独的生产者类进行额外处理并生成RequestScoped bean时,这是如何工作的?
在部署到应用服务器时,由于不明确的依赖关系,我得到了一个DeploymentException,因为托管bean和我的producer方法都符合条件。

事实上,它是有效的。在这种情况下,只要需要,CDI impl就会执行您的
@products
方法

您得到了异常,因为CDI按类型搜索bean,并且您有两个相同类型的定义。因此,如果您已经用
@products
声明了bean,那么就不能让CDI在类路径上拥有完全相同的bean定义

以下示例无效:

@ApplicationScoped
public class SomeFactory {

    @Produces
    public SomeBean produceSome() {
        return new SomeBean();
    }
}

@RequestScoped   // bug, redundant definition
public class SomeBean {
}
另外,详细信息还取决于
bean发现模式的实际值

您也可以查看此示例


P>个人,我不是一个自动发现和类路径扫描的爱好者,但是这个概念是CDI和java EE的基础。这就是我通常不推荐人们使用Java EE服务器的原因之一。

我正在摆脱生产者类,直接在RequestScoped Bean中进行额外的处理。这似乎是一种更好的方法,因此所有内容都在一个位置,而不是分布在两个类中。好的,唯一的解决方案是使用自定义限定符。我们过去在注入字符串时使用了这种方法。所以我宁愿彻底摆脱制片人。谢谢你的澄清!不客气。顺便说一句,自定义限定符并不是唯一的解决方案。另一种选择是从所有bean中删除
bean发现模式=“annotated”
+对于这些bean,您可以使用Producers方法、任何“bean定义注释”。