@Singleton vs @ApplicationScope

dog*_*ose 4 singleton static synchronized

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

由于传统 Singleton模式(private static instance)之后的Singleton 是在Sessions中共享的,我想知道@SingletonAnnotation是否以相同的方式工作?

文件说: Identifies a type that the injector only instantiates once.

这是否意味着,a @Singleton将是独立的User Session(对于id-generator而言是坏的)?我是否更喜欢old school单身Class.getInstance()注射超过@Singleton-Bean?

或者我应该既不使用也不应该在@ApplicationScopedbean中提供服务?

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

编辑:JSF 2.2,CDI和javax.inject.*我在说:)

mar*_*cus 22

所有这些类型的单身人士(static,@javax.inject.Singleton,@javax.ejb.Singleton@javax.enterprise.context.ApplicationScoped)创建了每个JVM一次.

每个用户会话创建一次的对象必须注释@javax.enterprise.context.SessionScoped,否则不会为每个用户会话实例化单例.

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

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

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

  • 一个小更正:“所有这些类型的单例(静态、@javax.inject.Singleton、@javax.ejb.Singleton 和 @javax.enterprise.context.ApplicationScoped)都是为每个 JVM 创建一次。” 从技术上讲,您可以运行多个应用程序在单个 JVM 中,并且规范允许这样做。这些项目的范围通常仅限于应用程序,因此 ApplicationScoped 是最有名的 (3认同)

srk*_*srk 6

javax.inject.Singleton - 当在您的 bean 上使用时,您必须实现writeResolve()readReplace避免任何序列化问题。根据你的豆子中实际含有的成分,明智地使用它。

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

如需了解更多信息,请参阅第 45