2010-07-02 17 views
9

Tôi có một ApplicationContext mùa xuân, nơi tôi khai báo bean máy chủ Jetty và khởi động nó. Bên trong Jetty Tôi có một DispatcherServlet và một vài bộ điều khiển. Làm thế nào để làm cho DispatcherServlet và các bộ điều khiển của nó sử dụng các bean từ cùng một ApplicationContext trong đó Jetty được khai báo?Làm thế nào để nhúng Jetty vào Spring và làm cho nó sử dụng cùng một AppContext nó được nhúng vào?

Thực tế, trong bối cảnh bên ngoài đó, tôi có một vài hạt giống như daemon và các phụ thuộc của chúng. Các bộ điều khiển bên trong Jetty sử dụng cùng các phụ thuộc, vì vậy tôi muốn tránh sao chép chúng bên trong và bên ngoài Jetty.

Trả lời

5

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; 
    } 

} 

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.

+1

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

+0

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

Các vấn đề liên quan