[java] CDI에서 @ApplicationScoped와 @Singleton 범위의 차이점은 무엇입니까?

CDI에는 @ApplicationScoped및 ( javax.inject) @Singleton의사 범위가 있습니다. 그들 사이의 차이점은 무엇입니까? @ApplicationScoped프록시되고 @Singleton그렇지 않은 사실 외에도 .

@Singleton콩을 다음으로 변경할 수 있습니까 @ApplicationScoped? @ApplicationScopedBean은 두 개 이상의 인스턴스를 가질 수 있습니까 ?



답변

@SingletonCDI 사양의 일부가 아닙니다. EJB 및 javax.inject(JSR-330)의 일부입니다 . 사양에 그 동작이 무엇인지 언급되어 있지 않으므로 용접 문서에 작성된 내용에만 의존 할 수 있습니다.


답변

요컨대 : 혼합 ( @Singleton@ApplicationScoped)도 가능하며 일부 시나리오에서는 의미가 있습니다.
(그리고 내에서 예상대로 작동합니다!)

지금까지의 다른 답변 외에도 실제 시나리오에서 명확하게 설명하기 위해 몇 가지 포인트를 추가하고 싶습니다.

나를 위해이 질문 은 애플리케이션 시작시 애플리케이션 범위 Bean을 강제로 인스턴스화하는 방법에서 개발되었습니다 .
일부 토론에서 나는 이것을 언급했으며 지금까지 유효한 주장을 찾을 수 없습니다.

많은 실제 시나리오 / 설정 에서 추상 / 모델링 관점에서 어떤 것이 EJB인지 애플리케이션 범위의 관리 빈인지 (또는 처리 될 것인지) 확실히 말하기는 어렵다고 말할 수 있습니다.

(논쟁의 여지가 있지만 결정적이지 않은) 지금까지 반대하는 주장 (내 관점에서 볼 때) : (@BalusC 및 기타 모든 것 : 결론이 내려지는 것을보고 싶지만 그렇지 않다면 위의 내용이 사실 일 수 있지만 그럼에도 불구하고 주장은 여전히 독자가 차이점 / 장점 / 단점 / 나쁜 / 좋은 관행을 얻을 수 있도록 도와줍니다)

EJB 대 관리 Bean

BalusC : 그것은 관리 빈이 아닌 EJB입니다. 이것은 상당히 다릅니다. EJB는 백엔드에서 실행되고 프런트 엔드에서 관리되는 Bean입니다. EJB는 트랜잭션 컨텍스트에서도 실행됩니다. […] 당신은 단지 엔터프라이즈 빈과 관리 빈을 혼동했고 나는 그것을 지적했습니다.

그러나:

: 나는 당신이 그다지 정확하지 않고 의미 / 용법을 과장하는 것 같고 그것은 나에게 논쟁의 여지가있는 것 같습니다. http://en.wikipedia.org/wiki/Enterprise_JavaBeans

EJB (Enterprise JavaBeans)는 엔터프라이즈 소프트웨어의 모듈 식 구성을위한 관리되는 서버 소프트웨어이며 여러 Java API 중 하나입니다. EJB는 애플리케이션의 비즈니스 로직을 캡슐화하는 서버 측 소프트웨어 구성 요소입니다.

엔터프라이즈 빈의 유형

“Stateful”, “Stateless”또는 “Singleton”일 수있는 Session Beans [3] […]

메시지 구동 콩 […]

… 내 경우에도 여전히 사실입니다.

싱글 톤 EJB 대 애플리케이션 범위 Bean

잠금

BalusC : 싱글 톤 EJB는 애플리케이션 범위 빈과 동일하지 않습니다. 싱글 톤 EJB는 읽기 / 쓰기가 잠겨 있으므로 염두에 둔 작업에 대해 잠재적으로 비효율적이거나 과도하게 복잡해집니다. 짧은 이야기 : 좋은 Java EE 책을 잡고 작업에 적합한 도구를 사용하는 방법을 배웁니다. 한 가지 방법은 다른 방법이 아닙니다. 작동한다고해서 올바른 도구라는 의미는 아닙니다. 큰 망치는 나사를 조일 수 있지만 반드시 올바른 도구는 아닙니다. 🙂

그러나:

(여기에서 큰 망치를 볼 수 없습니다-죄송합니다 …) 잠금 기본값을 아는 것이 좋지만 (알지 못함) 이것은 다시 잘못된 것 같습니다. Oracle Java EE 6 Tutorial on Managing Concurrent Access in a 싱글 톤 세션 빈

싱글 톤 세션 빈을 생성 할 때 싱글 톤의 비즈니스 메소드에 대한 동시 액세스는 컨테이너 관리 동시성과 Bean 관리 동시성의 두 가지 방법으로 제어 할 수 있습니다. […]

기본적으로 싱글 톤은 컨테이너 관리 동시성을 사용하지만 @ConcurrencyManagement (CONTAINER) 주석을 싱글 톤의 클래스 수준에 추가하여 동시성 관리 유형을 명시 적으로 설정할 수 있습니다.


답변

일반적으로 일부 객체의 인스턴스를 하나만 갖고 싶을 때 아마도 @ApplicationScoped주석을 사용해야합니다. 이러한 객체는 프록시되어 있으므로 즉시 올바르게 직렬화 할 수도 있습니다.

반면에 클래스의 인스턴스를 하나만 원하지만 이러한 클래스를 프록시 할 수없는 경우도 많이 있습니다 (예 : 최종 클래스이기 때문에) @Singleton. 이 때문에 Singleton, 의사 범위이며, 임의의 “정상적인”범위처럼 프록시되는 것은 아니다.


답변

@SingletonJSR-299에서 Singleton 이라는 기본 제공 범위의 JSR-299 관리 빈이 아니라 Singleton 세션 빈 ( javax.ejb.Singleton, 아님 javax.inject.Singleton)을 나타냅니다 .

@ApplicationScoped사양에서 명확하지 않기 때문에 EAR 당 하나 또는 WAR / EJB-JAR 당 하나 인 서버에서 찾을 수 있지만 JVM 당 하나 일 것으로 예상해서는 안됩니다.


답변

또 다른 차이점이 있습니다.
범위가 일반 범위가 아니기 @Singleton때문에 주석을 정의하는 Bean Singleton이 아닙니다. 그런 다음 @ApplicationScoped주석을 정의하는 빈입니다.

CDI 1.1 사양 사용 : 검색 모드의 응용 프로그램 = 주석이있는 경우 Weld는 @Singleton이 를 포함 하고로드 하지 않은 빈을 식별하지 않습니다.


답변

기본 생성자로 클래스를 작성할 수있는 주요 차이점 중 하나는를 사용할 때 개인 액세스 수정자가 javax.inject.Singleton있지만 클래스에는 사용할 때 최소한 기본 액세스 수정자가있는 기본 생성자가 있어야 javax.enterprise.context.ApplicationScoped하며 이것이 JBOSS 6.1 GA Final구현입니다.


답변