У меня есть Spring ApplicationContext, где я объявляю Гагатовый боб сервера и запускаю его. В Причале у меня есть DispatcherServlet и несколько контроллеров. Как сделать тот DispatcherServlet, и его контроллеры используют бобы от того же ApplicationContext, где Причал объявляется?
На самом деле в том внешнем контексте у меня есть несколько подобных демону бобов и их зависимости. Контроллеры в Причале используют те же зависимости, таким образом, я хотел бы постараться не копировать их внутри и снаружи Причала.
Я сделал это некоторое время назад.
В документации 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);
}
}
Это немного беспорядочно, и, вероятно, его можно улучшить, но это сработало для меня.