Dividir ApplicationContext en varios archivos

¿Cuál es la forma correcta de dividir la configuración de Spring en múltiples archivos xml?

Por el momento tengo

  • /WEB-INF/foo-servlet.xml
  • /WEB-INF/foo-service.xml
  • /WEB-INF/foo-persistence.xml

Mi web.xml tiene lo siguiente:

  Spring MVC Dispatcher Servlet intrafest  org.springframework.web.servlet.DispatcherServlet   contextConfigLocation  /WEB-INF/foo-*.xml   2   contextConfigLocation  /WEB-INF/foo-*.xml     org.springframework.web.context.ContextLoaderListener   

Las preguntas reales:

  • ¿Es este enfoque correcto / mejor ?
  • ¿De verdad necesito especificar las ubicaciones de configuración tanto en las secciones DispatcherServlet AND como context-param ?

¿Qué debo tener en cuenta para poder hacer referencia a los beans definidos en foo-servlet.xml desde foo-service.xml ? ¿Tiene esto algo que ver con especificar contextConfigLocation en web.xml ?

Actualización 1:

Estoy usando Spring framework 3.0. Tengo entendido que no necesito importar recursos de esta manera:

   

¿Es esta una suposición correcta?

Creo que la siguiente configuración es la más fácil.

Utilice el mecanismo de carga del archivo de configuración predeterminado de DispatcherServlet :

El marco, al inicializar un DispatcherServlet, buscará un archivo llamado [servlet-name] -servlet.xml en el directorio WEB-INF de su aplicación web y creará los beans definidos allí (anulando las definiciones de los beans definidos con el mismo nombre en el scope global).

En su caso, simplemente cree un archivo intrafest-servlet.xml en el intrafest-servlet.xml WEB-INF y no necesita especificar información específica en web.xml .

En el archivo intrafest-servlet.xml , puede usar la importación para componer su configuración XML.

       

Tenga en cuenta que el equipo de Spring en realidad prefiere cargar múltiples archivos de configuración al crear ApplicationContext (Web). Si aún desea hacerlo de esta manera, creo que no necesita especificar tanto los parámetros de context-param (parámetro de context-param ) como los parámetros de inicialización de servlet ( init-param ). Uno de los dos servirá. También puede usar comas para especificar múltiples ubicaciones de configuración.

Mike Nereson tiene esto que decir en su blog en:

http://blog.codehangover.com/load-multiple-contexts-into-spring/

Hay un par de maneras de hacer esto.

1. web.xml contextConfigLocation

Su primera opción es cargarlos todos en su contexto de aplicación web a través del elemento ContextConfigLocation. Ya va a tener su ApplicationContext principal aquí, suponiendo que está escribiendo una aplicación web. Todo lo que necesita hacer es poner un espacio en blanco entre la statement del siguiente contexto.

    contextConfigLocation   applicationContext1.xml applicationContext2.xml     org.springframework.web.context.ContextLoaderListener   

Lo anterior usa retornos de carro. Alternativamente, podrías poner un espacio.

    contextConfigLocation   applicationContext1.xml applicationContext2.xml     org.springframework.web.context.ContextLoaderListener   

2. resourceContext.xml recurso de importación

Su otra opción es simplemente agregar su applicationContext.xml primario al web.xml y luego usar las instrucciones de importación en ese contexto principal.

En applicationContext.xml es posible que tengas …

        

¿Qué estrategia debes usar?

1. Siempre prefiero cargar a través de web.xml .

Porque, esto me permite mantener todos los contextos aislados el uno del otro. Con las pruebas, podemos cargar solo los contextos que necesitamos para ejecutar esas pruebas. Esto hace que el desarrollo sea más modular también, ya que los componentes se mantienen loosely coupled , de forma que en el futuro pueda extraer un paquete o capa vertical y moverlo a su propio módulo.

2. Si está cargando contextos en una non-web application , usaría el recurso de import .

Hay dos tipos de contextos con los que nos enfrentamos:

1 : contexto raíz (contexto principal. Generalmente incluye todas las inicializaciones jdbc (ORM, Hibernate) y otras configuraciones relacionadas con la seguridad del resorte)

2 : contexto de servlet individual (contexto hijo. Contexto de servlet típico del despachador e inicialización de todos los beans relacionados con spring-mvc (controladores, asignación de URL, etc.)).

Aquí hay un ejemplo de web.xml que incluye múltiples archivos de contexto de aplicaciones

   Spring Web Application example   org.springframework.web.context.ContextLoaderListener   contextConfigLocation  /WEB-INF/spring/jdbc/spring-jdbc.xml  /WEB-INF/spring/security/spring-security-context.xml      spring-mvc org.springframework.web.servlet.DispatcherServlet  contextConfigLocation  /WEB-INF/spring/mvc/spring-mvc-servlet.xml     spring-mvc /admin/*   

@eljenso: intrafest-servlet.xml webapplication context xml se usará si la aplicación usa SPRING WEB MVC.

De lo contrario, la configuración de @kosoant está bien.

Ejemplo simple si no usa SPRING WEB MVC, pero quiere utilizar SPRIT IOC:

En web.xml:

  contextConfigLocation classpath:application-context.xml  

Luego, su application-context.xml contendrá: estas instrucciones de importación para cargar varios archivos de contexto de la aplicación y ponerlos en la aplicación principal-context.xml.

Gracias, y espero que esto ayude.

Soy el autor de modular-spring-contexts .

Esta es una pequeña biblioteca de utilidades para permitir una organización más modular de contextos de spring que la que se logra utilizando los metadatos de configuración basados ​​en XML . modular-spring-contexts funciona mediante la definición de módulos, que son básicamente contextos de aplicaciones independientes y que permiten a los módulos importar beans de otros módulos, que se exportan a su módulo de origen.

Los puntos clave son

  • control sobre dependencias entre módulos
  • control sobre los granos que se exportan y dónde se usan
  • posibilidad reducida de nombrar colisiones de frijoles

Un ejemplo simple se vería así:

Archivo moduleDefinitions.xml :

            

File serverModule.xml :

         

Archivo clientModule.xml