Tôi đã làm điều này một thời gian trước đây.
documentation của Spring cho thấy bạn sử dụng ContextLoaderListener
để tải ngữ cảnh ứng dụng cho servlets. Thay vì lớp Spring này, hãy sử dụng trình nghe của riêng bạn. Điều quan trọng ở đây là trình lắng nghe tùy chỉnh của bạn có thể được định nghĩa trong cấu hình Spring và có thể nhận biết được ngữ cảnh ứng dụng được định nghĩa trong; vì vậy thay vì tải ngữ cảnh ứng dụng mới, nó chỉ trả về ngữ cảnh đó.
Người nghe sẽ giống như thế này:
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;
}
}
và DelegatingContextLoader
thực hiện điều này:
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);
}
}
Đó là một chút lộn xộn, và có lẽ có thể được cải thiện, nhưng điều này đã làm việc cho tôi.
Nguồn
2010-07-02 08:33:09
Cảm ơn! Sau một số sửa đổi, tôi đã giải quyết được vấn đề của mình. Với giải pháp này, tôi nhận được 'ApplicationEventMulticaster not initialized' exception, bởi vì' GWAC' không được refeshed, nhưng khi tôi gọi 'refresh()' trên nó, tôi có ngoại lệ về postprocessors được gọi là lần thứ hai. Vì vậy, thay vì sử dụng 'GWAC', tôi đã tạo một lớp' WrapperWebApplicationContext' ủy nhiệm tất cả các lệnh gọi tới 'ApplicationContext' được truyền vào hàm tạo. Bây giờ nó hoạt động hoàn hảo. Ngoài ra, tôi đã ghi đè 'createWebApplicationContext' của' ContextLoaderListener' - theo cách này không cần sử dụng lớp 'ContextLoader'. – Fixpoint
Ok. Tôi bối rối. Làm thế nào để bạn nhận được thùng chứa servlet để sử dụng bean Listener mà bạn đã định nghĩa trong cấu hình spring thay vì tạo một cá thể mới không biết gì về applicationContext/beanFactory? – CupawnTae