2014-11-09 2 views
3

프로젝트의 경우 고유 한 ID 생성기가 필요합니다. 그래서 나는 동기화 된 방법으로 싱글 톤을 생각했다. @Singleton 주석이 동일한 방식으로 작동하는지 세션을 건너 공유되는 전통 싱글 톤 패턴 (private static instance) 다음 싱글 톤 이후 @Singleton 대 @ApplicationScope

, 궁금하네요?

문서는 말한다 : Identifies a type that the injector only instantiates once.

그것이 뜻하는 @Singleton이 (id를 발전기에 대한 나쁜) User Session 당 독립적 될 것이라고? @Singleton -Bean을 주입 할 때 과 함께 old school 싱글 톤을 선호해야합니까?

또는 @ApplicationScoped 콩 안에서 서비스를 제공하거나 제공하지 않아야합니까?

musst 사용자 세션에 관계없이 하나의 스레드 만 다음 ID를 생성하는 방법에 액세스 할 수 있음을 보장해야합니다. 내가 만든 싱글 (static, @javax.inject.Singleton, @javax.ejb.Singleton@javax.enterprise.context.ApplicationScoped)의 약 :

답변

14

그 모든 가지를 이야기하고, CDI JSF 2.2 javax.inject.* :

편집 (그것은 자동 증가 데이터베이스 ID를 풀 수 아니다) 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 컨테이너에서 관리하므로 트랜잭션이 추가 된 CDI 버전을 사용하지 않는 한 EJB에는 트랜잭션 및 잠금 기능이 없지만 여전히 좋은 점이 많습니다. @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 참조)
  • 일반 정적 필드는 간단하고 작동하지만 클래스 로더에 의해 제어되어 방법/인스턴스화되고 가비지 콜렉션이 (있는 경우) 수집 될 때, 클래스 로더가 작동하는 f}과 어플리케이션 서 v가 클래스 로더를 관리하는 f}을 이해해야합니다. 자세한 내용은 this question을 참조하십시오.