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

本文解释了您可以将RequestScoped bean注入到ApplicationScoped bean中,并且客户端代理将在请求期间指向正确的实例: 在CDI中更大范围的bean实例中注入更短范围的Bean实例 – 它是如何工作的?

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

确实,它有效。 在这种情况下,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 { } 

PS。 细节还取决于bean-discovery-mode的实际值。

您还可以查看此示例SO答案 。

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