2010-07-02 1 views
9

나는 Jetty 서버 빈을 선언하고 시작하는 Spring ApplicationContext를 가지고있다. Jetty 내부에는 DispatcherServlet과 두 개의 컨트롤러가 있습니다. DispatcherServlet과 그 컨트롤러가 Jetty가 선언 된 동일한 ApplicationContext에서 Bean을 사용하도록 만드는 방법은 무엇입니까?Jetty를 Spring에 임베드 (embed)하고 임베디드 된 AppContext와 동일한 것을 사용하는 방법은 무엇입니까?

실제로, 외부 컨텍스트에는 데몬과 유사한 몇 가지 bean과 그 종속성이 있습니다. Jetty 내부의 컨트롤러는 동일한 종속성을 사용하므로 Jetty 내부와 외부에서 중복되는 것을 피하고 싶습니다.

답변

5

나는 오래 전에 이것을했다.

스프링의 documentationContextLoaderListener을 사용하여 서블릿의 애플리케이션 컨텍스트를로드 할 것을 제안합니다. 이 Spring 클래스 대신에 독자적인 리스너를 사용하자. 여기서 중요한 점은 커스텀 리스너가 Spring 설정에서 정의 될 수 있고 정의 된 애플리케이션 컨텍스트를 인식 할 수 있다는 것입니다. 따라서 새로운 응용 프로그램 컨텍스트를로드하는 대신 해당 컨텍스트 만 반환합니다.

리스너는 다음과 같이 보일 것입니다 :

public class CustomContextLoaderListener extends ContextLoaderListener implements BeanFactoryAware { 

    @Override 
    protected ContextLoader createContextLoader() { 
     return new DelegatingContextLoader(beanFactory); 
    } 

    protected BeanFactory beanFactory; 

    @Override 
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
     this.beanFactory = beanFactory; 
    } 

} 

DelegatingContextLoader이 수행합니다

public class DelegatingContextLoader extends ContextLoader { 

    protected BeanFactory beanFactory; 

    public DelegatingContextLoader(BeanFactory beanFactory) { 
     this.beanFactory = beanFactory; 
    } 

    @Override 
    protected WebApplicationContext createWebApplicationContext(ServletContext servletContext, ApplicationContext parent) throws BeansException { 
     return new GenericWebApplicationContext((DefaultListableBeanFactory) beanFactory); 
    } 

} 

그것은 조금 지저분한, 그리고 아마도 향상 될 수 있지만, 이것은 나를 위해 일했다.

+1

감사! 몇 가지 수정 후 나는 내 문제를 해결. 이 솔루션을 사용하면'ApplicationEventMulticaster not initialized '예외가 발생합니다. 왜냐하면'GWAC'가 리플레 이스되지 않았기 때문에'refresh()'를 호출했을 때 두 번째 호출 된 포스트 프로세서에 대한 예외가 생겼습니다. 그래서'GWAC' 대신에 생성자에서 전달 된 모든 ApplicationContext에 대한 모든 호출을 위임 한 클래스 인 WrapperWebApplicationContext를 만들었습니다. 이제 완벽하게 작동합니다. 또한'ContextLoaderListener'의'createWebApplicationContext'를 오버라이드했습니다.이 방법으로'ContextLoader' 클래스를 사용할 필요가 없습니다. – Fixpoint

+0

나는 혼란 스럽다. applicationContext/beanFactory에 대해 아무것도 모르는 새로운 인스턴스를 생성하는 대신 Spring config에서 정의한 Listener 빈을 사용하도록 서블릿 컨테이너를 얻으려면 어떻게해야할까요? – CupawnTae