通过生产者将 RequestScoped CDI Bean 注入 ApplicationScoped CDI Bean class
Injecting RequestScoped CDI Bean into ApplicationScoped CDI Bean via Producer class
本文解释了您可以将 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?
当使用单独的生成器 class 进行一些额外处理并生成 RequestScoped bean 时,这是如何工作的?
部署到应用程序服务器后,由于托管 bean 和我的生产者方法都符合条件,因此由于不明确的依赖关系,我得到了 DeploymentException。
确实有效。在这种情况下,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 answer。
就个人而言,我不喜欢自动发现和类路径扫描 - 但这个概念是 CDI 和 Java EE 的基础。这就是我通常不推荐人们 Java EE 服务器的原因之一。
本文解释了您可以将 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?
当使用单独的生成器 class 进行一些额外处理并生成 RequestScoped bean 时,这是如何工作的? 部署到应用程序服务器后,由于托管 bean 和我的生产者方法都符合条件,因此由于不明确的依赖关系,我得到了 DeploymentException。
确实有效。在这种情况下,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 answer。
就个人而言,我不喜欢自动发现和类路径扫描 - 但这个概念是 CDI 和 Java EE 的基础。这就是我通常不推荐人们 Java EE 服务器的原因之一。