Le chargement dynamique de fichier de propriétés à l'aide de Printemps
J'ai écrit un PropertyUtils de classe (de l'internet), qui va charger les Propriétés
<bean id="propertiesUtil" class="com.myApp.PropertiesUtil" >
<property name="locations">
<list>
<value>classpath:myApp/myApp.properties</value>
</list>
</property>
</bean>
et un PropertiesUtil classe est comme ci-dessous
public class PropertiesUtil extends PropertyPlaceholderConfigurer {
private static Map<String, String> properties = new HashMap<String, String>();
@Override
protected void loadProperties(final Properties props) throws IOException {
super.loadProperties(props);
for (final Object key : props.keySet()) {
properties.put((String) key, props.getProperty((String) key));
}
}
public String getProperty(final String name) {
return properties.get(name);
}
}
Plus tard, je peux obtenir la propriété en appelant PropertiesUtil.méthode getProperty ().
Mais maintenant je veux le modifier légèrement pour que, Si le myApp.les propriétés sont modifiées par jour/modifiés par l'utilisateur, elle doit être chargée à nouveau
Probablement j'ai besoin FileWatcher classe
public abstract class FileWatcher extends TimerTask {
private long timeStamp;
private File file;
public FileWatcher(File file) {
this.file = file;
this.timeStamp = file.lastModified();
}
@Override
public final void run() {
long timeStampNew = this.file.lastModified();
if (this.timeStamp != timeStampNew) {
this.timeStamp = timeStampNew;
onChange(this.file);
}
}
protected abstract void onChange(File newFile);
}
mais mes doutes sont
- Comment puis-je créer un Fichier objet à l'aide de classpath:myApp/myApp.propriétés
(parce que le chemin absolu n'est pas connu) - Comment puis-je appeler/appeler le printemps à
charge/passer la nouvelle myApp.propriétés à PropetisUtil classe [en
onChange méthode].
Dans votre méthode loadProperties(), est-il une raison particulière pour laquelle vous êtes en boucle pour chaque propriété? Ne pouvez-vous pas appel à un constructeur de la classe de Propriétés qui prend Propriétés que les param?
OriginalL'auteur Reddy | 2013-01-02
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le Printemps ReloadableResourceBundleMessageSource classe comme ci-dessous:
Et puis vous pouvez appeler MessageSource.méthode getMessage() pour obtenir la valeur de la propriété. Voici un exemple:
Vous pouvez appeler directement ApplicationContext.getMessage(code de Chaîne, Object[] args, Locale locale) si vous avez renommé votre "myProperties' bean 'messageSource'.
Pour vos applications web, s'il vous plaît mettre votre propriété fichiers en dehors de votre application web du classpath (parce que le serveur web peut mettre en cache). Par exemple, le WEB-INF/conf/myApp.propriétés
OriginalL'auteur AnthonyY
Le suivant prend en charge ce que vous cherchez:
https://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html
Cela devrait faire l'affaire. Je n'ai pas utilisé moi-même, mais il semble être assez simple.
commons.apache.org/configuration/userguide/howto_filebased.html cela donne une assez bonne introduction.
Communes de configuration 2.x ne pas utiliser le FileChangedReloadingStrategy plus et a été remplacé. Voir commons.apache.org/proper/commons-configuration/userguide/...
OriginalL'auteur Till
Peut-être la manière la plus simple serait de faire comme ceci:
De cette façon, vous pouvez accéder à vos propriétés à partir de haricot par injection/accéder à un haricot avec un nom "configProperties".
Vous ne savez pas si c'est ce que vous avez besoin, car il n'est pas possible de modifier configProperties au moment de l'exécution. Mais c'est une méthode propre et vous n'avez pas besoin d'écrire de classe supplémentaire.
OriginalL'auteur kukulis