将applicationContext分割为多个文件
将Spring的configuration拆分为多个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
和context-param
部分中指定configuration位置吗?
我需要记住什么才能够从foo-service.xml
引用在foo-servlet.xml
定义的bean? 这是否与在web.xml
指定contextConfigLocation
有关?
更新1:
我正在使用Spring框架3.0。 这是我的理解,我不需要做这样的资源导入:
<import resource="foo-services.xml"/>
这是一个正确的假设吗?
我发现以下设置是最简单的。
使用DispatcherServlet的默认configuration文件加载机制:
在初始化DispatcherServlet时,框架将在您的Web应用程序的WEB-INF目录中查找名为[servlet-name] -servlet.xml的文件,并创build在那里定义的bean(覆盖定义的bean全球范围内的同名)。
在你的情况下,只需在WEB-INF
目录中创build一个文件intrafest-servlet.xml
,而不需要在web.xml
指定任何特定的信息。
在intrafest-servlet.xml
文件中,您可以使用导入来intrafest-servlet.xml
您的XMLconfiguration。
<beans> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/> <import resource="foo-services.xml"/> <import resource="foo-persistence.xml"/> </beans>
请注意,Spring团队实际上更喜欢在创build(Web)ApplicationContext时加载多个configuration文件。 如果你仍然想这样做,我想你不需要同时指定上下文参数( context-param
) 和 servlet初始化参数( init-param
)。 其中一个会做。 您也可以使用逗号来指定多个configuration位置。
Mike Nereson在他的博客上说:
http://blog.codehangover.com/load-multiple-contexts-into-spring/
有几种方法可以做到这一点。
1. web.xml contextConfigLocation
您的第一个select是通过ContextConfigLocation元素将它们全部加载到Web应用程序上下文中。 假设您正在编写一个Web应用程序,那么您将已经拥有主要的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导入资源
你的另一个select是只添加你的主applicationContext.xml到web.xml,然后在主要的上下文中使用import语句。
在
applicationContext.xml
你可能有…<!-- hibernate configuration and mappings --> <import resource="applicationContext-hibernate.xml"/> <!-- ldap --> <import resource="applicationContext-ldap.xml"/> <!-- aspects --> <import resource="applicationContext-aspects.xml"/>
你应该使用哪种策略?
我总是喜欢通过web.xml加载。
因为,这使我可以保持所有的背景彼此隔离。 通过testing,我们可以只加载运行这些testing所需的上下文。 这使得开发更加模块化,因为组件保持
loosely coupled
,以便将来我可以提取一个包或垂直层并将其移动到它自己的模块中。2.如果要将上下文加载到
non-web application
,则使用import
资源。
有两种types的上下文我们正在处理:
1 :根上下文(parent context),通常包括所有的jdbc(ORM,Hibernate)初始化和其他spring安全相关的configuration)
2 :单独的servlet上下文(child context.Typically Dispatcher Servlet上下文并初始化与spring-mvc(控制器,URL映射等)相关的所有bean)。
这是一个包含多个应用程序上下文文件的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-servlet.xml如果应用程序使用SPRING WEB MVC,将使用web应用程序上下文xml。
否则,@ kosoantconfiguration没问题。
简单的例子,如果你不使用SPRING WEB MVC,但想要使用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中。
谢谢,希望这有助于。
我是模块化的spring上下文的作者 。
这是一个小型实用程序库,允许使用Composing基于XML的configuration元数据来实现更加模块化的Spring上下文组织。 modular-spring-contexts
通过定义模块来工作,这些模块基本上是独立的应用上下文,并允许模块从其他模块导入bean,这些模块被导出到它们的发起模块中。
关键点是
- 控制模块之间的依赖关系
- 控制哪些bean被导出以及它们在哪里被使用
- 减less了命名豆类碰撞的可能性
一个简单的例子看起来像这样:
文件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>