2008-09-18 11 views

Respuesta

19

Desde el Spring Docs (v 2.5.5 Section 3.2.2.1.):

A menudo puede ser útil para dividir definiciones recipiente en múltiples archivos XML. Una forma de cargar un contexto de aplicación que es configurado a partir de todos estos fragmentos XML es utilizar el constructor de contexto de la aplicación que toma ubicaciones de recursos múltiples. Con una fábrica de frijoles , se puede utilizar varias veces un lector de definición de frijoles para leer las definiciones de cada archivo.

En general, el equipo de Primavera prefiere el enfoque anterior, ya que mantiene los archivos de configuración del contenedor conscientes del hecho de que están siendo combinarse con otros. Un enfoque alternativo es usar una o más ocurrencias del elemento para cargar definiciones de bean de otro archivo (o archivos). Veamos una muestra :

<import resource="services.xml"/> 
<import resource="resources/messageSource.xml"/> 
<import resource="/resources/themeSource.xml"/> 

<bean id="bean1" class="..."/> 
<bean id="bean2" class="..."/> 

En este ejemplo, frijol externa las definiciones que se cargan a partir de 3 archivos, services.xml, messageSource.xml y themeSource .xml. Todas las vías de ubicación se consideran en relación con el archivo de definición haciendo la importación, por lo services.xml en este caso debe ser en el mismo directorio o ruta de clase ubicación que el archivo haciendo la importación , mientras messageSource.xml y themeSource .xml debe estar en una ubicación de recursos debajo de la ubicación del archivo de importación . Como puede ver, una barra inclinada inicial se ignora, pero dado que se consideran rutas relativas, es probable que sea mejor forma para no utilizar la barra en absoluto. El contenido de los archivos que se importan debe ser archivos XML válidos de definición de bean de acuerdo con Spring Schema o DTD, incluido el elemento de nivel superior .

+0

Absolutamente de acuerdo con los documentos de Spring: la agregación de archivos de configuración supera las importaciones explícitas todo el tiempo. Si para nada más que para la prueba de la unidad. –

2

Sí, puede hacerlo a través del elemento de importación.

<import resource="services.xml"/> 

atributo de recursos de cada elemento es una ruta válida (por ejemplo, ruta de clase: foo.xml)

3

Hacemos esto en nuestros proyectos en el trabajo, utilizando el cargador de recursos classpath * en Spring. Para una aplicación determinada, se cargarán todos los archivos appcontext contiene el ID de aplicación:

classpath*:springconfig/spring-appname-*.xml 
+0

Estoy confundido. nuevo ClassPathResource ("classpath *: springconfig/spring-appname - *. xml") es lo que está proponiendo? –

+1

tienen que estar en desacuerdo. solíamos trabajar con este enfoque, y siempre lleva a cargar el archivo de configuración incorrecto. en nuestro caso, teníamos los archivos XML de primavera en una carpeta especial "conf", pero obviamente también se escondían dentro de los diversos frascos. este enfoque carga TODOS los archivos de configuración desde cualquier lugar en el classpath, anulando los que cree que están cargados. – ihadanny

+0

Contexto importante: "appname" es, por supuesto, específico para la aplicación que estamos creando, y los diversos archivos de contexto de primavera están en módulos Maven donde el módulo de aplicación más específico hereda las otras partes de sus dependencias. Además, el patrón de nombre de archivo debe protegerlo de recoger archivos aleatorios. –

2

Teniendo en cuenta lo que Nicholas me señaló a Encontré esto en la documentación. Me permite recoger en tiempo de ejecución de los contextos de frijol que me interesan.

GenericApplicationContext ctx = new GenericApplicationContext(); 
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx); 
xmlReader.loadBeanDefinitions(new ClassPathResource("modelContext.xml")); 
xmlReader.loadBeanDefinitions(new ClassPathResource("uiContext.xml")); 
ctx.refresh(); 
1

Esto es lo que he hecho por uno de mis proyectos. En el archivo de web.xml, puede definir los archivos de frijol de primavera que desea que su aplicación utilice:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/applicationContext.xml 
     /WEB-INF/modelContext.xml 
     /WEB-INF/ui.xml 
    </param-value> 
    </context-param> 

Si esto no está definido en su web.xml, que busca automáticamente /WEB-INF/applicationContext.xml

+0

No estoy usando Spring MVC, solo el COI –

0

Otra cosa a tener en cuenta es que aunque puedes hacer esto, si no eres un gran fanático de XML, puedes hacer muchas cosas en Spring 2.5 con anotaciones.

0

Sí, puede usar la etiqueta dentro del archivo de beans "Maestro". Pero, ¿y el por qué? ¿Por qué no enumerar los archivos en el contextConfigLocation context param de la matriz wab.xml o als locations de la fábrica de bean?

Creo que los archivos mutliple son mucho más fáciles de manejar. Puede elegir solo algunos de ellos para una prueba, simplemente agregue cambiar el nombre o eliminar una parte de la aplicación y puede enlazar diferentes aplicaciones con los mismos archivos de configuración (una aplicación web y una versión de línea de comandos con algunas definiciones de bean superpuestas).

Cuestiones relacionadas