Nouvelle mise à jour de répondre à couvrir script bean
Une autre approche soutenue par spring 2.5.x+ est que le script de la fève. Vous pouvez utiliser une variété de langues pour votre script BeanShell est probablement la plus intuitive étant donné qu'elle a la même syntaxe que Java, mais elle nécessite des dépendances externes. Cependant, les exemples sont en Groovy.
Section 24.3.1.2 du Ressort de la Documentation traite de la façon de le configurer, mais voici quelques saillants extraits illustrant l'approche que j'ai édité pour les rendre plus applicable à votre situation:
<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>
Avec le Groovy script comme ceci:
package org.example
class GroovyMessenger implements Messenger {
private String message = "anotherProperty";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message
}
}
L'administrateur de système veut faire des changements alors qu'ils (ou vous) pouvez modifier le contenu du script de façon appropriée. Le script ne fait pas partie de l'application déployée et peut faire référence à un fichier connu (ou celui qui est configuré par le biais d'un PropertyPlaceholderConfigurer pendant le démarrage).
Bien que l'exemple utilise une classe Groovy, vous pourriez avoir la classe à exécuter du code qui lit un simple fichier de propriétés. De cette façon, vous ne jamais modifier le script directement, il suffit de toucher pour changer l'heure et la date. Cette action déclenche alors la recharger, ce qui déclenche à son tour l'actualisation des propriétés de l' (mise à jour) le fichier de propriétés qui, enfin, met à jour les valeurs dans le Ressort du contexte et vous partez.
La documentation ne souligner que cette technique ne fonctionne pas pour le constructeur injection, mais peut-être que vous pouvez travailler autour de cela.
Mise à jour de la réponse à la couverture dynamique des changements de propriété
Citation de cet article, qui fournit l'intégralité du code source, une approche est la suivante:
* 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
L'observateur modèle est mis en œuvre par
les interfaces et les classes
ReloadableProperties,
ReloadablePropertiesListener,
PropertiesReloadedEvent, et
ReloadablePropertiesBase. Aucun d'entre eux
sont particulièrement passionnants, tout à fait normal
auditeur de la manipulation. La classe
DelegatingProperties sert à
de manière transparente à l'échange de l'actuel
propriétés lorsque les propriétés sont
mis à jour. Nous n'mise à jour de l'ensemble de la
carte de propriété à la fois, de sorte que le
l'application peut éviter des incohérences
les états intermédiaires (plus sur cela
plus tard).
Maintenant, le
ReloadablePropertiesFactoryBean peut être
écrit pour créer un
ReloadableProperties instance (au lieu
une des Propriétés de l'instance, comme le
PropertiesFactoryBean n'). Lorsque
vous êtes invité à le faire, le RPFB vérifie
la modification de fichier de fois, et si
nécessaire, mises à jour de ses
ReloadableProperties. Cela déclenche
le pattern observer des machines.
Dans notre cas, le seul auditeur est l'
ReloadingPropertyPlaceholderConfigurer.
Il se comporte exactement comme un standard de printemps
PropertyPlaceholderConfigurer, à l'exception de
qu'il suit toutes les utilisations de l'
des espaces réservés. Maintenant, lorsque les propriétés sont
reloaded, tous les usages de chaque modifié
propriété sont trouvés, et les propriétés
de ces singleton haricots sont affectés
de nouveau.
Réponse originale à cette question ci-dessous couvrant statiques des modifications de la propriété:
Des sons comme vous voulez juste pour injecter des propriétés externes dans votre Printemps contexte. L' PropertyPlaceholderConfigurer
est prévu à cet effet:
<!-- 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>
vous ensuite de référence externe propriétés avec Ant syntaxe des espaces réservés (qui peuvent être imbriquées, si vous voulez à partir du Printemps 2.5.5 à partir)
<bean id="example" class="org.example.DataSource">
<property name="password" value="${password}"/>
</bean>
Veiller à ce que l'application.les propriétés de fichier n'est accessible qu'à l'administrateur et de l'utilisateur exécutant l'application.
Exemple d'application.propriétés:
mot de passe=Aardvark