나는 오래 전에 이것을했다.
스프링의 documentation은 ContextLoaderListener
을 사용하여 서블릿의 애플리케이션 컨텍스트를로드 할 것을 제안합니다. 이 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);
}
}
그것은 조금 지저분한, 그리고 아마도 향상 될 수 있지만, 이것은 나를 위해 일했다.
감사! 몇 가지 수정 후 나는 내 문제를 해결. 이 솔루션을 사용하면'ApplicationEventMulticaster not initialized '예외가 발생합니다. 왜냐하면'GWAC'가 리플레 이스되지 않았기 때문에'refresh()'를 호출했을 때 두 번째 호출 된 포스트 프로세서에 대한 예외가 생겼습니다. 그래서'GWAC' 대신에 생성자에서 전달 된 모든 ApplicationContext에 대한 모든 호출을 위임 한 클래스 인 WrapperWebApplicationContext를 만들었습니다. 이제 완벽하게 작동합니다. 또한'ContextLoaderListener'의'createWebApplicationContext'를 오버라이드했습니다.이 방법으로'ContextLoader' 클래스를 사용할 필요가 없습니다. – Fixpoint
나는 혼란 스럽다. applicationContext/beanFactory에 대해 아무것도 모르는 새로운 인스턴스를 생성하는 대신 Spring config에서 정의한 Listener 빈을 사용하도록 서블릿 컨테이너를 얻으려면 어떻게해야할까요? – CupawnTae