respuesta más actualizado para cubrir con guión bean
Otro enfoque apoyado por 2.5.x resorte + es el de la haba de guión. Puede utilizar una variedad de idiomas para su secuencia de comandos: BeanShell es probablemente el más intuitivo dado que tiene la misma sintaxis que Java, pero requiere algunas dependencias externas. Sin embargo, los ejemplos están en Groovy.
Sección 24.3.1.2 de la Spring Documentation cubre cómo configurar esto, pero aquí hay algunos extractos más destacados que ilustran el enfoque que yo he editado para que sean más aplicables a su situación:
<beans>
<!-- This bean is now 'refreshable' due to the presence of the 'refresh-check-delay' attribute -->
<lang:groovy id="messenger"
refresh-check-delay="5000" <!-- switches refreshing on with 5 seconds between checks -->
script-source="classpath:Messenger.groovy">
<lang:property name="message" value="defaultMessage" />
</lang:groovy>
<bean id="service" class="org.example.DefaultService">
<property name="messenger" ref="messenger" />
</bean>
</beans>
Con el maravilloso guión con este aspecto:
package org.example
class GroovyMessenger implements Messenger {
private String message = "anotherProperty";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message
}
}
como administrador del sistema quiere hacer cambios, entonces ellos (o usted) pueden editar el contenido de la escritura de manera apropiada. La secuencia de comandos no es parte de la aplicación implementada y puede hacer referencia a una ubicación de archivo conocida (o una que esté configurada mediante un PropertyPlaceholderConfigurer estándar durante el inicio).
Aunque el ejemplo usa una clase Groovy, puede hacer que la clase ejecute código que lea un archivo de propiedades simple. De esa manera, nunca edita el script directamente, simplemente tóquelo para cambiar la marca de tiempo. A continuación, esa acción desencadena la recarga, que a su vez desencadena la actualización de las propiedades del archivo de propiedades (actualizado), que finalmente actualiza los valores en el contexto de Spring y listo.
La documentación señala que esta técnica no funciona para la inyección de constructores, pero tal vez pueda solucionarlo.
respuesta Actualización para cubrir propiedad dinámica cambia
Quoting from this article, que provides full source code, un enfoque es:
* a factory bean that detects file system changes
* an observer pattern for Properties, so that file system changes can be propagated
* a property placeholder configurer that remembers where which placeholders were used, and updates singleton beans’ properties
* a timer that triggers the regular check for changed files
El patrón de observador es implementado por las interfaces y clases ReloadableProperties, PropiedadesRecargablesListener, PropertiesReloadedEvent y Propiedades recargablesBase. Ninguno de ellos es especialmente emocionante, solo normal oyente manejo. La clase DelegatingProperties sirve para intercambiar de forma transparente las propiedades actuales cuando las propiedades están actualizadas. Solo actualizamos la totalidad del mapa de la propiedad a la vez, de modo que la aplicación puede evitar estados intermedios inconsistentes (más sobre esto más adelante).
Ahora los ReloadablePropertiesFactoryBean puede haber escrita para crear una instancia de ReloadableProperties (en lugar de una instancia propiedades, como lo hace el PropertiesFactoryBean). Cuando se le solicite , el RPFB comprueba los tiempos de modificación del archivo , y si es necesario , actualiza sus Propiedades recargables. Esto desencadena la maquinaria del patrón observador.
En nuestro caso, el único oyente es ReloadingPropertyPlaceholderConfigurer. Se comporta como un resorte estándar PropertyPlaceholderConfigurer, excepto que rastrea todos los usos de marcadores de posición. Ahora cuando se vuelven a cargar las propiedades , se encuentran todos los usos de cada propiedad modificada, y las propiedades de esos beans singleton tienen asignado nuevamente.
Respuesta original por debajo cubriendo cambios en las propiedades estáticas:
Suena como lo que desea inyectar propiedades externas en su contexto primavera. El PropertyPlaceholderConfigurer
está diseñado para este fin:
<!-- Property configuration (if required) -->
<bean id="serverProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- Identical properties in later files overwrite earlier ones in this list -->
<value>file:/some/admin/location/application.properties</value>
</list>
</property>
</bean>
a continuación referencia a las propiedades externas con marcadores de posición de sintaxis (Ant que se pueden anidar si quieres de primavera 2.5.5 en adelante)
<bean id="example" class="org.example.DataSource">
<property name="password" value="${password}"/>
</bean>
A continuación, asegúrese que el archivo application.properties solo es accesible para el usuario administrador y el usuario que ejecuta la aplicación.
Ejemplo de aplicación.propiedades:
password = Aardvark
Entonces, ¿el bean 'configuration' necesita ser actualizado en tiempo de ejecución, o cada vez que el administrador cambia los valores? ¿Esa es tu pregunta? ¿O desea que los beans 'DataSource' /' MailSender' usen la configuración actualizada en tiempo de ejecución? ¿O son ambos? – madhurtanwani
Es el segundo: quiero actualizar los valores de configuración inyectados en el tiempo de ejecución (ver editar en OP). –