2014-01-05 2 views
0

Picocontainer Web (picocontainer-web-core-2.5.1.jar)을 사용하려고합니다.Picocontainer Web을 사용하는 방법?

나는 모든 것을 구성하고 난 ... 컨테이너에서 무엇을 검색하려고 할 때까지, 모든 것이 잘 작동하는지 체크 아웃 : P

그래도 난 내가 PicoServletContainerFilter 클래스에서 정적 메서드 getRequestComponentForThread (클래스 형식)를 사용한다을,

public static Object getRequestComponentForThread(Class type) { 
     MutablePicoContainer requestContainer = ServletFilter.currentRequestContainer.get(); 
     MutablePicoContainer container = new DefaultPicoContainer(requestContainer); 
     container.addComponent(type); 
     return container.getComponent(type); 
} 

을하지만 당신이 볼 수 있듯이, 그 방법, DefaultPicoContainer의 새로운 인스턴스가 생성되고 내가 검색하기 위해 노력하고있어 형식이 등록되고 : 이는 다음과 같습니다.

  • 유형은 클래스의 경우 - (" 'ExampleInterface는'인스턴스화하지 않습니다") 실행시 예외 - 새 인스턴스가
  • 유형은 인터페이스의 경우
  • 이 ... 만들어 반환하는 대신 부모 컨테이너에서 하나의 캐시 3 행 (addComponent)에서 throw됩니다.

내 질문은 : 이 라이브러리를 사용하는 방법? 나는 그것을 이해하고 있음을 확신했지만,이 한 가지 방법을 구현하면 내 마음이 아프다 ...

답변

1

사실 특별한 경우가 아니면 getComponent를 사용하면 안됩니다. pico 컨텍스트 수신기를 web.xml에 추가 할 때 App/Session/Request 컨테이너가 생성됩니다. 각 범위에 대해 구성 요소를 구성하기 만하면 피코 콘테이너가 자동으로 물건을 주입하고 필요할 때 구성 요소를 인스턴스화합니다. 또한 시작 가능한 라이프 사이클 인터페이스를 사용하십시오.

0

나는 org.picocontainer.web.PicoServletContainerFilter.ServletFilter의 자체 버전을 작성하면서 하나의 수용 가능한 해결책을 찾아 냈다. 방법 :

public class MyComponentContainer extends PicoServletContainerFilter { 

    /* 
    code from original class PicoServletContainerFilter.ServletFilter 
    [...] 
    */ 

    public static <T> T getComponent(Class<T> clazz) { 
     return (T) currentRequestContainer.get().getComponent(clazz); 
    } 
} 

최선의 방법인지 잘 모르겠지만 제대로 작동합니다. 그러나, 당신이 더 나은 솔루션을 알고 있다면 나는 정보에 대해 감사 할 것입니다.

관련 문제