CDI 中的@ApplicationScoped范围和@Singleton范围之间有什么区别?EJB 与托管 Bean单例 EJB 与应用程序范围的 Bean

2022-08-31 09:19:14

在 CDI 中,有 和 () 伪范围。它们之间有什么区别?除了事实是代理的,而不是。@ApplicationScopedjavax.inject@Singleton@ApplicationScoped@Singleton

我可以把我的豆子改成?Bean 可以有两个(或更多)个实例吗?@Singleton@ApplicationScoped@ApplicationScoped


答案 1

@Singleton不是 CDI 规范的一部分。它是EJB和(JSR-330)的一部分。规范中没有提到它的行为是什么,因此您只能依赖 Weld 文档中写入的内容。javax.inject


答案 2

简而言之:您甚至可以将其混合(@Singleton@ApplicationScoped),这在某些情况下是有意义的。(并按预期在我的工作!

除了到目前为止的其他答案之外,我还想补充一些要点,以便在现实世界的场景中进行澄清。

对于我来说,这个问题是由如何强制应用程序范围的Bean在应用程序启动时实例化的?在一些讨论中,我陈述了这一点,到目前为止找不到反对它的有效论据:

在许多现实生活中的场景/设置中,我会说很难肯定地说 - 从抽象/建模的角度来看 - 某些东西是(或将成为/被视为)EJB还是应用程序范围的托管Bean。

(有争议的,但不是决定性的)到目前为止反对它的论点(从我的角度来看):(@BalusC和所有其他论点:我希望看到它们具有决定性,但如果不是,上述内容可能成立,尽管如此,这些论点仍然可以帮助读者获得差异/优点/缺点/坏/好的做法)

EJB 与托管 Bean

BalusC:这是一个EJB,而不是一个受管理的bean,这是完全不同的。EJB 在后端运行,托管 Bean 在前端运行。EJB 也在事务上下文中运行。[...]您只是将企业 Bean 与托管 Bean 混淆了,我刚刚指出了这一点。

但:

:我认为你不是很正确,夸大了含义/用法,这对我来说看起来值得商榷。http://en.wikipedia.org/wiki/Enterprise_JavaBeans

Enterprise JavaBeans (EJB) 是一款用于模块化构建企业软件的受控服务器软件,也是几个 Java API 之一。EJB 是一个服务器端软件组件,它封装了应用程序的业务逻辑。

企业豆的类型

会话豆[3]可以是“有状态”,“无状态”或“单例”[...]

消息驱动的豆子 [...]

...这在我的情况下仍然适用。

单例 EJB 与应用程序范围的 Bean

锁定

BalusC:单例 EJB 与应用程序范围的 Bean 不同。单例 EJB 是读/写锁定的,因此对于您心中的任务来说,效率可能低下/过度复杂。长话短说:拿起一本好的Java EE书,学习使用正确的工具来完成这项工作。一种方式绝对不是另一种方式。它的工作原理并不意味着它是正确的工具。大锤能够固定螺钉,但它不一定是正确的工具,:)

但:

(我在这里看不到大锤-对不起...)很高兴知道锁定默认值(我不知道),但这似乎又是不正确的:Oracle Java EE 6关于在单例会话Bean中管理并发访问的教程

创建单例会话 Bean 时,可以通过两种方式控制对单例业务方法的并发访问:容器管理的并发性和 Bean 管理的并发。[...]

尽管默认情况下,单例使用容器管理的并发,但可以在单例的类级别添加@ConcurrencyManagement(CONTAINER) 注释以显式设置并发管理类型