2009-02-10 23 views

Respuesta

7

no te recomendaría que hacer eso. ¿Qué espera que suceda a los granos simples, que su configuración modificada? ¿Esperas que todos los singletons se recarguen? pero algunos objetos pueden contener referencias a esos singletons.

ver esta publicación, así Automatic configuration reinitialization in Spring

10

Bueno, puede ser útil para realizar una recarga tal contexto, mientras que las pruebas de su aplicación.

Puede probar el método refresh de una de las clases AbstractRefreshableApplicationContext: no actualizará 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 se obtiene este resultado

fromContextA 
fromContextB 

Otra forma de lograr esto (y tal vez una más sencilla) es usar la función Refreshable frijol de primavera 2.5+ Con lenguaje dinámico (maravilloso, etc) y la primavera, incluso puede cambiar su comportamiento de frijol. Eche un vistazo al spring reference for dynamic language:

24.3.1.2. habas actualizables

Uno de los (si no el) más valor convincente añade la dinámica de apoyo lengua en la primavera es la característica 'frijol actualizable'.

Un grano de refreshable es un bean -idioma respaldados dinámico que con una pequeña cantidad de configuración, un dinámico-idioma respaldados bean puede cambios del monitor en su recurso de archivo fuente subyacente, y después recargar sí cuando se cambia el archivo fuente del lenguaje dinámica (por ejemplo, cuando un ediciones de desarrollo y ahorra cambios en el archivo en el sistema de archivos ).

2

Puede consultar este http://www.wuenschenswert.net/wunschdenken/archives/138 donde una vez que cambia algo en el archivo de propiedades y lo guarda, los beans se vuelven a cargar con los nuevos valores.

+0

Esto fue adaptado en https://github.com/Unicon/springframework-addons/wiki/Auto-reloading-properties-files – Vadzim

+0

Enlaces actualizados: http://maven-repository.com/artifact/net.unicon. springframework/springframework-addons/0.1, https://github.com/UniconLabs/springframework-addons/blob/master/src/main/java/net/unicon/springframework/addons/properties/ReloadingPropertyPlaceholderConfigurer.java, https: // github.com/knightliao/disconf/blob/master/disconf-client/src/main/java/com/baidu/disconf/client/addons/properties/ReloadingPropertyPlaceholderConfigurer.java – Vadzim

1

Para aquellos tropiezo en este más recientemente - el camino actual y moderna para resolver este problema es utilizar Spring Boot's Cloud Config.

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

Así, por ejemplo, esta clase de control:

@RefreshScope 
@RestController 
class MessageRestController { 

    @Value("${message}") 
    private String message; 

    @RequestMapping("/message") 
    String getMessage() { 
     return this.message; 
    } 
} 

devolverá el nuevo valor de su propiedad message cadena para el punto final /message cada vez que se actualiza la configuración.

Consulte el ejemplo oficial Spring Guide for Centralized Configuration para obtener más detalles sobre la implementación.

Cuestiones relacionadas