将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>