Я использую Servlet 3 (Tomcat 7) + Spring 3.1 и пытаюсь загрузить свое веб-приложение с помощью WebApplicationInitializer.
В обычных примерах, которые я видел, у вас есть корневой ApplicationContext, загруженный с помощью ContextLoaderListener, и сервлет ApplicationContext, загруженный с помощью DispatcherServlet.
(Чтобы было ясно, я говорю не о web.xml, а о программном обеспечении внутри WebApplicationInitializer).
Теперь я хотел бы иметь иерархию ApplicationContexts, скажем:
Корень -> AppContext1 -> AppContext2 -> ServletAppContext
-> обозначает отношение Родитель -> Дочерний элемент. Каждый AppContext может получить доступ к своим собственным компонентам и компонентам своих предков.
Например:
- Корень определяет свойства, DAO и TX.
- AppContext1 определяет репозитории JPA и Spring Data.
- AppContext2 определяет каналы интеграции JMS и Spring.
- ServletAppContext определяет контроллеры и представления.
Мой первый подход состоял в том, чтобы добавить корневой ApplicationContext в ContextLoaderListener, а затем установить его в качестве родителя AppContext1. Установите AppContext1 в качестве родителя AppContext2. Установите AppContext2 в качестве родителя ServletAppContext. И, наконец, свяжите ServletAppContext с DispatcherServlet.
Дело в том, что во время выключения DispatcherServlet закрывает ServletAppContext, но не распространяется. AppContext1 и AppContext2 никогда не закрываются, их bean-компоненты никогда не освобождаются. Поэтому я предполагаю, что использую неправильный подход.
Я попытался связать AppContext2 с ContextLoaderListener вместо Root. В этом случае AppContext2 закрывается, но AppContext1 и Root остаются открытыми.
Я также не могу иметь 3 ContextLoaderListeners, по 1 для каждого из моих AppContexts (Root, 1, 2).
У меня вопрос, какой правильный подход в этой ситуации? Я открыт для предложений.