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


96

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

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


12
용접 참조 를 읽어 보셨습니까 ? 섹션 5.4 (p. 36)에 @ApplicationScoped와 사이의 실제적인 차이점에 대한 설명이 있습니다 @Singleton.
— brandizzi 2011

1
javax.ejb 또는 javax.inject-어떤 Singleton 범위를 참조하고 있습니까?
— John Ament 2015

답변:


30

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


11
그건 사실이 아니야. 주석 javax.inject.Singleton이 있습니다. CDI의 일부입니다. 여기 확인 : docs.jboss.org/weld/reference/1.0.1-Final/en-US/html_single/...이
— amorfis

5
@amorphis-내 앞에 CDI 사양이 있습니다. 나는 그것의 일부를 구현하기도했지만 @Singleton. 설명없이 하나의 예에서만 표시됩니다. CDI가에 의존하는 것은 사실 javax.inject이지만 엄밀히 말하면 CDI 사양의 일부가 아닙니다. 즉, 내 대답을 약간 수정했습니다.
— Bozho 2010

17

요컨대 : 혼합 ( @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) 주석을 싱글 톤의 클래스 수준에 추가하여 동시성 관리 유형을 명시 적으로 설정할 수 있습니다.


Weld는 다음과 같이 혼합하여 즐겁지 않습니다. 앱을로드하는 동안 예외 : CDI 정의 실패 : WELD-000046 : [EnhancedAnnotatedTypeImpl] public ApplicationScoped Singleton MyClass에 최대 하나의 범위를 지정할 수 있습니다. javax.inject.Singleton 사용.
— sgflt

12

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

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


나는 이것이 매우 불분명하기 때문에 이것을 반대합니다. 저는 Java EE로 5 년 동안 코딩하고 자습서를 듣고 책을 읽었지만 "이러한 객체는 프록시 처리됨", "올바르게 직렬화 될 수 있음"및 "의사- 범위". 나는 당신이 무슨 말을하는지 아는 것처럼 들리기 때문에 이것이 무엇을 의미하는지 알고 싶습니다. 그러나 그것이 쓰여진 것처럼 당신의 대답이 대부분의 Java EE 개발자에게 도움이 될 것이라고 상상할 수 없습니다.
— DavidS

2
즉, EJB가 프록시된다는 것을 알고 있습니다. 내 혼란은 부분적으로 당신이 싱글 톤에 대해 만드는 구별에 관한 것입니다.
— DavidS

9

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

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


7

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

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


2

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


"기본 생성자"를 의미 했습니까?
— Treefish Zhang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.