2013-05-23 1 views
3

합니까 CDI을 풀링하는 것은? 어떤 방법으로 풀링 할 수 있습니다. 그래서 예를 들어있는 경우이 두 콩CDI와 나는이 <code>EJB</code> 콩의 기능입니다 아담 비엔 컨테이너 반사를 통해 클래스의 새 인스턴스를 만들거나 기존의 것을 사용할지 여부를 선택이 <a href="http://www.adam-bien.com/roller/abien/entry/dependency_injection_8230_and_there" rel="nofollow">screencast</a> 말한다 생각하기 때문에

@RequestScoped 
public class RequestBean { 

    public void doIt() { 

    } 
} 

@SessionScoped 
public class SessionBean { 

    @Inject 
    private RequestBean bean;  

    public void doSomething() { 
     bean.doIt(); 
    } 
} 

질문은 - 수영장에 doSomething 또는 CDI 컨테이너가 어떻게 든 관리 않습니다 인스턴스를 호출시 생성 RequestBean의 항상 새로운 인스턴스가?

답변

10

첫 번째 요청의 범위가 지정되므로 요청마다 새 인스턴스가 만들어집니다. 두 번째 세션의 범위가 지정되므로 각 세션에 대해 새 세션이 만들어집니다.

CDI는 개체가 상태 저장 여부에 대해 잘 모르며 이전 요청에서 Bean이 이전에 가지고 있던 상태를 되 찾는 것을 원하지 않기 때문에 개체를 저장하고 재활용하지 않습니다 의뢰. 그것은 요청/세션 범위의 모든 부분을 망칠 것입니다.

빈을 만들 때 비용이 많이 들지 않는 한 (새 연결이나 새 연결을 시작하기 때문에) 풀을 풀어도 아무런 이점이 없습니다. 수명이 짧은 오브젝트는 생성 속도가 매우 빠르고 최근에는 가비지 수집이 가능합니다. 그리고 빈이 실제로 생성하는데 비용이 많이 든다면 아마도 싱글 톤이어야합니다.

+0

좋은 설명, 고마워! –

+1

하지만 한 가지 질문 - EJB에 풀링되는 Stateless beans의 요점은 무엇인가?에 기초하여 같지 않습니까? 나는 컨테이너가 상태없는 빈을 만들어 풀에 넣은 다음 요청시 철회한다고 가정합니다 모든 필드를 null로 재설정하고 다시 풀에 넣습니다. 그렇다면 이것이 왜 Stateless bean으로 작동하고 RequestScoped bean으로 작동하지 않는지, 나는 그 차이를 볼 수 있을지 확신 할 수 없다. (EJB Stateless Bean과 CDI RequestScoped는 나에게 꽤 비슷해 보인다.) –

+1

Stateless Bean은 Stateless이다. 따라서 대화식 상태가되어서는 안되며 개발자는 필드에 항목을 저장하면 나중에 재사용 할 때 다시 가져올 수 있음을 알고 있습니다. 상태없는 콩이 지금 발명 되었다면 아마도 풀링되지 않을 것입니다. 그러나 그들은 객체 할당이 지금만큼 빠르지 않았던 순간 (2000 년경)에 발명되었고, 우리가 지금 가지고있는 모든 경험이 없었습니다. –