Как встроить Причал в Spring и заставить его использовать тот же AppContext, в который он был встроен?

У меня есть Spring ApplicationContext, где я объявляю Гагатовый боб сервера и запускаю его. В Причале у меня есть DispatcherServlet и несколько контроллеров. Как сделать тот DispatcherServlet, и его контроллеры используют бобы от того же ApplicationContext, где Причал объявляется?

На самом деле в том внешнем контексте у меня есть несколько подобных демону бобов и их зависимости. Контроллеры в Причале используют те же зависимости, таким образом, я хотел бы постараться не копировать их внутри и снаружи Причала.

9
задан Fixpoint 1 July 2010 в 21:05
поделиться

1 ответ

Я сделал это некоторое время назад.

В документации Spring предлагается использовать 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);
    }

}

Это немного беспорядочно, и, вероятно, его можно улучшить, но это сработало для меня.

5
ответ дан 3 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: