Разделение приложенияКонтекст для нескольких файлов
Каков правильный способ разделения конфигурации Spring на несколько xml файлов?
В данный момент у меня есть
-
/WEB-INF/foo-servlet.xml
-
/WEB-INF/foo-service.xml
-
/WEB-INF/foo-persistence.xml
My 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
, так и context-param
?
Что мне нужно иметь в виду, чтобы иметь возможность ссылаться на beans, определенный в foo-servlet.xml
от foo-service.xml
? Это связано с определением contextConfigLocation
в web.xml
?
Обновление 1:
Я использую Spring framework 3.0. Я понимаю, что мне не нужно делать импорт ресурсов следующим образом:
<import resource="foo-services.xml"/>
Это правильное предположение?
Ответы
Ответ 1
Я нахожу следующую настройку самой легкой.
Использовать механизм загрузки файла конфигурации по умолчанию DispatcherServlet:
Структура будет при инициализации диспетчерской службы, найдите файл с именем [servlet-name] -servlet.xml в каталоге WEB-INF вашей сети приложения и создайте beans(переопределение определения любого beans, определенного с помощью одно и то же имя в глобальном масштабе).
В вашем случае просто создайте файл intrafest-servlet.xml
в директории WEB-INF
и не нужно указывать какую-либо конкретную информацию в web.xml
.
В файле intrafest-servlet.xml
вы можете использовать import для составления вашей конфигурации XML.
<beans>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
<import resource="foo-services.xml"/>
<import resource="foo-persistence.xml"/>
</beans>
Обратите внимание, что команда Spring фактически предпочитает загружать несколько файлов конфигурации при создании (Web) ApplicationContext. Если вы все еще хотите это сделать, я думаю, вам не нужно указывать оба параметра контекста (context-param
) и параметры инициализации сервлета (init-param
). Один из них сделает это. Вы также можете использовать запятые, чтобы указать несколько мест конфигурации.
Ответ 2
Майк Нересон должен это сказать в своем блоге по адресу:
http://blog.codehangover.com/load-multiple-contexts-into-spring/
Есть несколько способов сделать это.
1. web.xml contextConfigLocation
Ваш первый вариант - загрузить их все в свое веб-приложение контекст через элемент ContextConfigLocation. Ты уже собираешься для вашего основного приложенияContext здесь, предполагая, что вы пишете веб-приложение. Все, что вам нужно сделать, это установить пробел между объявление следующего контекста.
<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
Другой вариант - просто добавить основной файл applicationContext.xml в web.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.
Потому что это позволяет мне изолировать все контексты от каждого Другие. С помощью тестов мы можем загружать только те контексты, которые нам нужны для запуска эти испытания. Это делает разработку более модульной, так как компоненты оставайтесь loosely coupled
, так что в будущем я могу извлечь пакет или вертикального слоя, и переместите его в собственный модуль.
2. Если вы загружаете контексты в non-web application
, я бы использовал ресурс import
.
Ответ 3
Есть два типа контекстов, с которыми мы имеем дело:
1: корневой контекст (исходный контекст). Обычно включают в себя всю инициализацию jdbc (ORM, Hibernate) и другую конфигурацию, связанную с безопасностью spring)
2: индивидуальный контекст сервлета (дочерний контекст. Типично Диспетчерский сервлет Контекст и инициализировать все beans, связанные с 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>
Ответ 4
@eljenso: intrafest-servlet.xml контекст webapplication xml будет использоваться, если приложение использует SPRING WEB MVC.
В противном случае конфигурация @kosoant прекрасна.
Простой пример, если вы не используете SPRING WEB MVC, но хотите utitlize SPRING IOC:
В web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-context.xml</param-value>
</context-param>
Затем ваш application-context.xml будет содержать: <import resource="foo-services.xml"/>
эти операторы импорта загружают различные файлы контекста приложения и помещаются в основное приложение-context.xml.
Спасибо и надеюсь, что это поможет.
Ответ 5
Я автор modular-spring-contexts.
Это небольшая библиотека функций, позволяющая более модульную организацию контекстов spring, чем достигается с помощью Составление метаданных конфигурации на основе XML, modular-spring-contexts
работает путем определения модулей, которые в основном представляют собой автономные контексты приложений и позволяют модулям импортировать beans из других модулей, которые экспортируются в их исходный модуль.
Затем ключевыми точками являются
- контроль зависимостей между модулями
- контроль, из которого beans экспортируется и где они используются
- уменьшена вероятность именования столкновений beans
Простой пример будет выглядеть так:
Файл 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>
Файл 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>
Файл 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>