通过Producer类将RequestScoped CDI Bean注入ApplicationScoped CDI Bean

时间:2016-02-25 10:15:02

标签: java dependency-injection cdi java-ee-7

本文解释了您可以将RequestScoped bean注入ApplicationScoped bean,并且客户端代理将在请求期间指向正确的实例: Bean instance of a shorter scope injected in a bean instance of a larger scope in CDI - how does it work?

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

1 个答案:

答案 0 :(得分:1)

确实,它有效。在这种情况下,CDI impl只需在需要时执行@Produces方法。

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

以下示例无效:

@ApplicationScoped
public class SomeFactory {

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

@RequestScoped   // bug, redundant definition
public class SomeBean {
}

聚苯乙烯。详细信息还取决于bean-discovery-mode的实际值。

您还可以查看此示例SO answer

就个人而言,我不是自动发现和类路径扫描的粉丝 - 但这个概念是CDI和Java EE的基础。这是我通常不推荐人Java EE服务器的原因之一。