java - springframework - spring initializr
¿Puedo componer un archivo de configuración de primavera de los más pequeños? (7)
Dado lo que Nicholas me indicó, encontré esto en los documentos. Me permite elegir en tiempo de ejecución los contextos de beans 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();
Tengo un puñado de proyectos que usan un proyecto para el modelo de datos. Cada uno de estos proyectos tiene su propio archivo applicationContext.xml con una gran cantidad de datos repetitivos dentro de él.
Me gustaría tener un archivo modelContext.xml y otro para mi ui.xml, etc.
¿Puedo hacer esto?
De Spring Docs (v 2.5.5 Sección 3.2.2.1.) :
A menudo puede ser útil dividir definiciones de contenedor en múltiples archivos XML. Una forma de cargar un contexto de aplicación que está configurado a partir de todos estos fragmentos XML es usar el constructor de contexto de la aplicación que toma múltiples ubicaciones de Recursos. Con una fábrica de beans, un lector de definición de beans puede usarse varias veces para leer las definiciones de cada archivo por turno.
Generalmente, el equipo de Spring prefiere el enfoque anterior, ya que mantiene los archivos de configuración del contenedor inconscientes del hecho de que se combinan con otros. Un enfoque alternativo es usar una o más apariciones 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, las definiciones externas de bean se están cargando desde 3 archivos, services.xml, messageSource.xml y themeSource.xml. Todas las rutas de ubicación se consideran en relación con el archivo de definición que realiza la importación, por lo que services.xml en este caso debe estar en el mismo directorio o ubicación de classpath que el archivo que realiza la importación, mientras que messageSource.xml y themeSource.xml deben estar en un recurso ubicación debajo de la ubicación del archivo de importación. Como puede ver, una barra diagonal inicial en realidad se ignora, pero dado que se consideran rutas relativas, probablemente sea mejor no usar la barra. Los contenidos de los archivos que se importan deben ser archivos de definición de bean XML válidos de acuerdo con Spring Schema o DTD, incluido el elemento de nivel superior.
Esto es lo que hice para uno de mis proyectos. En su archivo web.xml
, puede definir los archivos Spring Bean que desea que use su aplicación:
<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
, automáticamente busca /WEB-INF/applicationContext.xml
Hacemos esto en nuestros proyectos en el trabajo, utilizando el cargador de recursos classpath * en Spring. Para una determinada aplicación, se cargarán todos los archivos de contexto de aplicación que contengan la ID de la aplicación:
classpath*:springconfig/spring-appname-*.xml
Otra cosa a tener en cuenta es que, aunque puedes hacer esto, si no eres un gran admirador de XML, puedes hacer muchas cosas en Spring 2.5 con anotaciones.
Sí, puedes hacer esto a través del elemento de importación.
<import resource="services.xml"/>
El atributo de recursos de cada elemento es una ruta válida (por ejemplo, classpath: foo.xml)
Sí, puedes usar la etiqueta dentro del archivo de frijol "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).