tutorial sesiones mvc modelandview mediante manejo framework español ejemplo desarrollo aplicaciones spring

sesiones - spring mvc



Archivo de configuración de primavera de recarga/actualización sin reiniciar el contenedor de servlets (4)

¿Cómo puedo actualizar el archivo de configuración de Spring sin reiniciar mi contenedor de servlets?

Estoy buscando una solución que no sea JRebel.



Bueno, puede ser útil realizar tal recarga de contexto mientras pruebas tu aplicación.

Puede probar el método de refresh de una de las clases AbstractRefreshableApplicationContext : no refrescará sus beans instanciados previamente, pero la próxima llamada en el contexto devolverá los beans actualizados.

import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.springframework.context.support.FileSystemXmlApplicationContext; public class ReloadSpringContext { final static String header = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>/n" + "<!DOCTYPE beans PUBLIC /"-//SPRING//DTD BEAN//EN/"/n" + " /t/"http://www.springframework.org/dtd/spring-beans.dtd/">/n"; final static String contextA = "<beans><bean id=/"test/" class=/"java.lang.String/">/n" + "/t/t<constructor-arg value=/"fromContextA/"/>/n" + "</bean></beans>"; final static String contextB = "<beans><bean id=/"test/" class=/"java.lang.String/">/n" + "/t/t<constructor-arg value=/"fromContextB/"/>/n" + "</bean></beans>"; public static void main(String[] args) throws IOException { //create a single context file final File contextFile = File.createTempFile("testSpringContext", ".xml"); //write the first context into it FileUtils.writeStringToFile(contextFile, header + contextA); //create a spring context FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext( new String[]{contextFile.getPath()} ); //echo the bean ''test'' on stdout System.out.println(context.getBean("test")); //write the second context into it FileUtils.writeStringToFile(contextFile, header + contextB); //refresh the context context.refresh(); //echo the bean ''test'' on stdout System.out.println(context.getBean("test")); } }

Y obtienes este resultado

fromContextA fromContextB

Otra forma de lograr esto (y tal vez una más simple) es utilizar la función Refreshable Bean de Spring 2.5+. Con un lenguaje dinámico (groovy, etc.) y la primavera, incluso puedes cambiar el comportamiento de tu frijol. Eche un vistazo a la referencia de primavera para el lenguaje dinámico :

24.3.1.2. Frijoles refrescantes

Uno de los valores añadidos (si no los más) del soporte de lenguaje dinámico en Spring es la función de "bean renovable".

Un bean renovable es un bean respaldado en lenguaje dinámico que con una pequeña cantidad de configuración, un bean respaldado en lenguaje dinámico puede monitorear los cambios en su recurso de archivo fuente subyacente, y luego recargarse cuando se cambia el archivo fuente del lenguaje dinámico (para ejemplo cuando un desarrollador edita y guarda cambios en el archivo en el sistema de archivos).


No te recomendaría que hicieras eso. ¿Qué esperas que suceda con los beans singleton modificados por su configuración? ¿Esperas que todos los singletons se recarguen? pero algunos objetos pueden contener referencias a esos singletons.

Ver también esta publicación Reinicialización de configuración automática en Spring


Para aquellos que tropezaron con esto más recientemente, la forma actual y moderna de resolver este problema es usar la configuración de la nube de Spring Boot .

Simplemente agregue la anotación @RefreshScope en sus beans actualizables y @EnableConfigServer en su main / configuration.

Entonces, por ejemplo, esta clase de Controlador:

@RefreshScope @RestController class MessageRestController { @Value("${message}") private String message; @RequestMapping("/message") String getMessage() { return this.message; } }

Devolverá el nuevo valor de la propiedad String de su message para el punto final /message cada vez que se actualice su configuración.

Consulte el ejemplo oficial de la Guía de primavera para la configuración centralizada para obtener más detalles sobre la implementación.