@Singleton vs @ApplicationScope

问题描述 投票:4回答:2

对于一个项目,我需要一个唯一的ID生成器。所以我想到了具有同步方法的Singleton。

由于传统的Singleton模式(qazxsw poi)之后的Singleton在Sessions之间共享,我想知道qazxsw poi Annotation是否以相同的方式工作?

文档说:private static instance

这是否意味着,@Singleton将是独立的Identifies a type that the injector only instantiates once.(这对id-generator不好)?我应该更喜欢@Singleton Singleton和User Session注射old school-Bean吗?

或者我应该既不使用也不在Class.getInstance() bean中提供服务?

必须保证只有一个独立于用户会话的线程可以访问该方法来生成下一个id。 (自动增量数据库ID无法解决)

编辑:JSF 2.2,CDI和@Singleton我在谈论:)

static singleton synchronized
2个回答
21
投票

所有这些单体(@ApplicationScopedjavax.inject.*static@javax.inject.Singleton)都是根据JVM创建的。

每个用户会话创建一次的对象必须使用@javax.ejb.Singleton进行注释,因此不会为每个用户会话实例化单例。

请注意,有两个@javax.enterprise.context.ApplicationScoped注释,一个在@javax.enterprise.context.SessionScoped,另一个在@Singleton包中。我指的是他们完全合格的名字以避免混淆。

所有这些单身人士之间的差异是微妙的,我不确定我是否知道所有的含义,但有一些想到:

  • javax.inject由EJB容器管理,因此它可以处理事务(javax.ebj),读/写锁定和超时(@javax.ejb.Singleton@javax.ejb.TransactionAttribute),应用程序启动(@javax.ejb.Lock@javax.ejb.AccessTimeout)等。
  • @javax.ejb.Startup由CDI容器管理,因此您将不具备EJB所具有的事务和锁定功能(除非您使用已添加事务的1.0后CDI),但您仍然有很多很好的东西,例如@javax.ejb.DependsOn@javax.enterprise.context.ApplicationScoped@javax.enterprise.inject.Produces@javax.annotation.PostConstruct(其中许多功能也可供EJB使用)。
  • @javax.inject.Named类似于@javax.enterprise.inject.Disposes,除了没有代理对象(客户端将直接引用该对象)。到达真实对象的间接性会更少,但这可能会导致与序列化相关的一些问题(请参阅:@javax.inject.Singleton
  • 一个普通的静态字段很简单并且有效,但是它由类加载器控制,以便了解它们如何/何时被实例化和垃圾收集(如果有的话),您将需要了解类加载器如何工作以及您的应用程序服务器如何管理它的类装载机。有关详细信息,请参阅@ApplicationScoped

0
投票

javax.inject.Singleton - 在bean上使用时,必须实现http://docs.jboss.org/weld/reference/latest-2.2/en-US/html_single/#_the_singleton_pseudo_scopethis question以避免任何序列化问题。根据你的bean实际拥有的内容,明智地使用它。

javax.enterprise.context.ApplicationScoped - 允许容器代理bean并自动处理序列化过程。建议这样做以避免前所未有的问题。

有关更多信息,请参阅writeResolve()第45页。

© www.soinside.com 2019 - 2024. All rights reserved.