9

我有一个 Spring ApplicationContext,我在其中声明 Jetty 服务器 bean 并启动它。在 Jetty 内部,我有一个 DispatcherServlet 和几个控制器。如何使 DispatcherServlet 及其控制器使用声明 Jetty 的同一 ApplicationContext 中的 bean?

事实上,在那个外部上下文中,我有几个类似守护进程的 bean 及其依赖项。Jetty 内部的控制器使用相同的依赖项,所以我想避免在 Jetty 内部和外部复制它们。

4

1 回答 1

5

我不久前做过这个。

Spring 的文档建议您使用 aContextLoaderListener来加载 servlet 的应用程序上下文。而不是这个 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);
    }

}

它有点乱,可能可以改进,但这对我有用。

于 2010-07-02T08:33:09.697 回答