简而言之:您甚至可以将其混合(@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) 注释以显式设置并发管理类型