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.