对于一个项目,我需要一个唯一的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
我在谈论:)
所有这些单体(@ApplicationScoped
,javax.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
。javax.inject.Singleton - 在bean上使用时,必须实现http://docs.jboss.org/weld/reference/latest-2.2/en-US/html_single/#_the_singleton_pseudo_scope和this question以避免任何序列化问题。根据你的bean实际拥有的内容,明智地使用它。
javax.enterprise.context.ApplicationScoped - 允许容器代理bean并自动处理序列化过程。建议这样做以避免前所未有的问题。
有关更多信息,请参阅writeResolve()
第45页。