2017-12-08 35 views
1

@RequestScoped으로 주석 된 bean을 생성하면 각 요청마다 새 프록시 인스턴스가 인스턴스화 될 것으로 예상됩니다.CDI는 RequestScoped에 대한 프록시를 재사용합니까?

반면에 각 요청은 자체 스레드와 연결됩니다.

내 질문은 : 새 요청이 이전에 생성 한 스레드를 풀에서 재사용하는 경우 이전에 만든 bean/service의 프록시 객체를 CDI에서 다시 사용하겠습니까?

답변

4

우선, 클라이언트 프록시 객체! = bean 인스턴스 (또는 사양 문구를 따르고 싶다면 문맥 인스턴스)을 이해하는 것이 중요합니다. @RequestScoped의 경우 각 요청에 대해 항상 새 빈 인스턴스가 작성됩니다. 그러나 @RequestScoped은 정상 범위이므로 클라이언트 프록시가 삽입되고이 프록시가 Bean 인스턴스에 위임됨을 의미합니다.

이제 클라이언트 프록시 개체에 대한 질문으로 돌아갑니다. 전략은 구현에 따라 다릅니다. 스펙에 따르면 컨테이너는 빈마다 하나의 클라이언트 프록시 객체를 인스턴스화하고 여러 개의 주입 지점간에 공유 할 수 있습니다. 그러나 필수 사항은 아닙니다 (this documentation 참조). 참조 구현 (Weld, WildFly, GlassFish 등) 클라이언트 프록시 객체를 공유합니다. 그러나 다시, 우리는 빈 인스턴스가 아니라 클라이언트 프록시에 대해 말하고 있습니다.

WRT 스레드 연관 - 요청 컨텍스트가 하나의 스레드와 연관되어 있지만 요청이 끝나면 (모든 Bean 인스턴스를 포함하여) 컨텍스트가 삭제되고 스레드가 분리됩니다.

+0

그래서 대답은 다음과 같습니다. 아니요? – Andremoniy

+1

아니, 대답은 - "예, ** 용접 ** 프록시 개체를 재사용 할 수 있습니다"입니다. – Siliarus

+0

제 말은 마틴의 말에서 암시 된 것입니다. 나는 그의 대답을 완전히 두 번째로 철자 할 수 있습니다. 그것이 바로 웰드의 방식입니다. 그러나 다시 한번, 그것은 내부의 일입니다. CDI 사양은 이것이 어떻게 작동 하는지를 요구하지 않습니다. – Siliarus