¿Dónde poner el archivo de configuración de Spring?

18

Quiero integrar Spring Framework en mi proyecto, especialmente en el lado del servidor.

Por lo tanto, no quiero ponerlo dentro de la carpeta WEB-INF del archivo war.

¿Debo poner un applicationContext.xml en cada capa (significa cada proyecto ya que está dividido en proyectos distintos? (Servicios, Dominio y DAO)

¿Cuál es la buena práctica?

Mik378
fuente
2
Esto puede ser relevante: stackoverflow.com/questions/5967405/…
NoChance

Respuestas:

25

La estructura del archivo Maven puede ayudar con esto

En esencia, los archivos de configuración de Spring (que pueden tener cualquier nombre, no solo el genérico applicationContext.xml) se tratan como recursos classpath y se archivan en src/main/resources. Durante el proceso de compilación, estos se copian en el WEB-INF/classesdirectorio, que es el lugar normal para que estos archivos terminen.

Las variaciones incluyen un springdirectorio adicional (por ejemplo src/main/resources/spring) para separar los contextos de Spring de otros recursos dedicados a los marcos de aplicaciones. Es posible que desee dividir los contextos de la aplicación en capas dedicadas como:

example-servlet.xml
example-data.xml
example-security.xml

y así.

¿Qué pasa con diferentes entornos como desarrollo / prueba / producción?

Por lo general, su configuración de Spring debe recoger la configuración del entorno de su, ejem, entorno. Por lo general, esto significa utilizar JNDI, JDBC, variables de entorno o archivos de propiedades externos para proporcionar la configuración necesaria. Los enumero en orden de preferencia ya que JNDI es generalmente más fácil de administrar que los archivos de propiedades externas en un clúster de producción controlado.

En el caso de las pruebas de integración, es posible que deba usar un archivo de configuración de Spring "solo de prueba". Esto contendría contextos especiales que usan beans de prueba o configuración. Estos estarían presentes en src / test / resources y pueden tener un test-prefijo para asegurarse de que los desarrolladores conozcan su propósito. Un uso típico sería proporcionar una fuente de datos que no sea JNDI, tal vez dirigida a una base de datos HSQLDB durante las pruebas automatizadas de compilación y se referenciaría dentro del caso de prueba.

Sin embargo, en general, la mayoría de los archivos de contexto de Spring no deberían necesitar modificaciones especializadas a medida que se mueven entre niveles. Debería darse el caso de que se use el mismo artefacto de compilación (por ejemplo, archivo WAR) en dev / test / production solo con credenciales diferentes.

Gary Rowe
fuente
2

¿Su proyecto está dividido en módulos Maven? Si es así, puede agregar un módulo adicional solo para los archivos de configuración. Vamos a llamarlo módulo de configuración

config-module
      |
      |--> src\main\resources\config\spring\applicationContex.xml
      |--> src\main\resources\config\properties\application.properties
      |--> pom.xml

Tal configuración es una sugerencia. Configure su propio conjunto de archivos. Empaquételo como un JAR y agregue este módulo como dependencia de cualquier otro módulo (web, ear's lib, otro jar).

Tendrá acceso a los recursos del módulo de configuración (xml, propiedades, etc.) porque están en el classpath.

pom del módulo web

<dependency>
    <groupId>com.myproject.group</groupId>
    <artifactId>config-module</artifactId>
</dependency>

Luego use las declaraciones de importación de archivos de contexto externos de Spring. Por ejemplo

<import resource="classpath*:com/package/subpackage/**/config/applicationContext.xml" />
Laiv
fuente
Esta fue una gran idea! Me tomé la libertad de agregar un poco más porque su ejemplo "recurso de importación" no funcionaba para mí ... Todavía estoy aprendiendo el "filtrado" de la declaración de importación (según el nombre completo del paquete) ... y no trabajé ese hipo (para futuros lectores) para distraerme de esta gran idea y respuesta. Gracias Laiv!
granadaCoder
Una de las razones por las cuales su importación "lo que creo que debería funcionar" puede estar fallando es por este error: github.com/spring-projects/spring-framework/issues/16017
granadaCoder