Разделение applicationContext на несколько файлов
Как правильно разделить конфигурацию Spring на несколько xml-файлов?
на данный момент у меня
/WEB-INF/foo-servlet.xml
/WEB-INF/foo-service.xml
/WEB-INF/foo-persistence.xml
мой web.xml
имеет следующие:
<servlet>
<description>Spring MVC Dispatcher Servlet</description>
<servlet-name>intrafest</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/foo-*.xml
</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/foo-*.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
собственно вопросы:
- это подход правильный/лучший?
- мне действительно нужно указать места конфигурации как в
DispatcherServlet
и thecontext-param
разделы?
что нужно иметь в виду, чтобы иметь возможность ссылаться на бобы, определенные в foo-servlet.xml
С foo-service.xml
? Это имеет какое-то отношение к указанию contextConfigLocation
in web.xml
?
обновление 1:
я использую Весна фреймворк 3.0. Это мое понимание, что мне не нужно делать импорт ресурсов, как это:
<import resource="foo-services.xml"/>
это правильно предположение?
5 ответов:
Я нахожу следующую настройку самой простой.
используйте механизм загрузки конфигурационного файла по умолчанию DispatcherServlet:
фреймворк будет, при инициализации в DispatcherServlet, искать файл с именем [servlet-name] - сервлет.XML в каталоге WEB-INF вашего сайта применение и создание бобов определения (переопределения определения любых бобов, определенных с помощью то же самое имя в глобальном масштаб.)
в вашем случае, просто создайте файл
intrafest-servlet.xml
наWEB-INF
dir и не нужно указывать какую-либо конкретную информацию вweb.xml
.на
Майк Нересон имеет это сказать в своем блоге по адресу:
http://blog.codehangover.com/load-multiple-contexts-into-spring/
есть несколько способов сделать это.
1. сеть.xml contextConfigLocation
ваш первый вариант загрузить их в веб-приложения контекст через элемент ContextConfigLocation. Ты уже уходишь чтобы иметь ваш основной applicationContext вот, предполагая, что вы пишете веб-приложение. Все, что вам нужно сделать, это поставить некоторые пробелы между объявление следующего контекста.
<context-param> <param-name> contextConfigLocation </param-name> <param-value> applicationContext1.xml applicationContext2.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
выше использует возврат каретки. Кроме того, я мог просто положить в пространство.
<context-param> <param-name> contextConfigLocation </param-name> <param-value> applicationContext1.xml applicationContext2.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
2. applicationContext.xml import resource
ваш другой вариант - просто добавить свой основной applicationContext.XML к сети.xml, а затем использовать инструкции импорта в этом основном контекст.
на
applicationContext.xml
вы могли бы...<!-- hibernate configuration and mappings --> <import resource="applicationContext-hibernate.xml"/> <!-- ldap --> <import resource="applicationContext-ldap.xml"/> <!-- aspects --> <import resource="applicationContext-aspects.xml"/>
какую стратегию следует использовать?
1. я всегда предпочитаю загружать через web.xml.
потому что это позволяет мне держать все контексты изолированными друг от друга другой. С помощью тестов мы можем загружать только те контексты, которые нам нужно запустить то испытание. Это делает разработку более модульной тоже в качестве компонентов остановиться!--4-->, так что в будущее я могу извлечь пакет или вертикальный слой и переместить его в свой собственный модуль.
2. если вы загружаете контексты в
non-web application
, Я бы использовалimport
ресурсов.
есть два типа контекстов, с которыми мы имеем дело:
1: корневой контекст (Родительский контекст. Обычно включают всю инициализацию jdbc(ORM, Hibernate) и другую конфигурацию, связанную с безопасностью spring)
2: отдельный контекст сервлета (дочерний контекст.Обычно диспетчер контекста сервлета и инициализирует все компоненты, связанные с spring-mvc (контроллеры , сопоставление URL и т. д.)).
вот пример web.XML, который включает в себя несколько файлов контекста приложения
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>Spring Web Application example</display-name> <!-- Configurations for the root application context (parent context) --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/jdbc/spring-jdbc.xml <!-- JDBC related context --> /WEB-INF/spring/security/spring-security-context.xml <!-- Spring Security related context --> </param-value> </context-param> <!-- Configurations for the DispatcherServlet application context (child context) --> <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/mvc/spring-mvc-servlet.xml </param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/admin/*</url-pattern> </servlet-mapping> </web-app>
@eljenso: intrafest-сервлет.XML и веб-приложения контекст XML будет использоваться, если приложение использует Spring MVC в веб.
в противном случае конфигурация @kosoant в порядке.
простой пример, если вы не используете SPRING WEB MVC, но хотите использовать SPRING IOC:
в интернете.XML-код:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application-context.xml</param-value> </context-param>
затем приложения-контекст.XML будет содержать:
<import resource="foo-services.xml"/>
эти операторы импорта загружают различные файлы контекста приложения и помещают в main контекст приложения.XML.спасибо и надеюсь, что это помогает.
Я автор книги modular-spring-contexts.
это небольшая библиотека утилит, позволяющая более модульную организацию контекстов spring, чем это достигается с помощью составление метаданных конфигурации на основе XML.
modular-spring-contexts
работает путем определения модулей, которые в основном являются автономными контекстами приложений и позволяют модулям импортировать бобы из других модулей, которые экспортируются в их исходный модуль.ключевые моменты тогда являются
- контроль над зависимостями между модулями
- контроль над тем, какие зерна экспортируются и где они используются
- уменьшена возможность именования коллизий бобов
простой пример будет выглядеть так:
File
moduleDefinitions.xml
:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <module:module id="serverModule"> <module:config location="/serverModule.xml" /> </module:module> <module:module id="clientModule"> <module:config location="/clientModule.xml" /> <module:requires module="serverModule" /> </module:module> </beans>
File
serverModule.xml
:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <bean id="serverSingleton" class="java.math.BigDecimal" scope="singleton"> <constructor-arg index="0" value="123.45" /> <meta key="exported" value="true"/> </bean> </beans>
File
clientModule.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <module:import id="importedSingleton" sourceModule="serverModule" sourceBean="serverSingleton" /> </beans>