2012-11-06 18 views
12

Ich verwende die Eigenschaftendatei mit Spring 3. Wenn Spring seinen Inhalt initialisiert, lädt er die Eigenschaftendatei und fügt sie in alle Beans mit @Value Annotation ein.So laden Sie Eigenschaften mit Spring?

Ich möchte eine Möglichkeit haben, einige Eigenschaften in einer Datei zu aktualisieren und einen JMX auf dem Server verfügbar zu machen, der die neuen Eigenschaften zu Spring lädt - ohne den Server neu zu starten und seinen Kontext neu zu laden.

Kann ich dies implementieren, indem Sie eine Spring-Methode verwenden, um Eigenschaften neu zu laden und sie in alle Beans zu füllen, oder sollte ich etwas Ähnliches selbst schreiben?

Antwort

6

Ich würde empfehlen, die java.util.Properties durch eine PropertiesConfiguration aus dem Apache Commons Configuration Projekt zu ersetzen. Es unterstützt das automatische Neuladen, entweder durch Erkennen, wenn sich die Datei ändert, oder durch Auslösen über JMX.

+0

Das ist Ok, aber wie kann ich alle neuen Eigenschaften zu den Bohnen zu füllen? Ich wollte eine Spring-Methode verwenden, um diese Eigenschaften neu zu laden und alle Beans zu überschreiben und die neuen Werte zu setzen. – Julias

+0

Angenommen, die 'PropertiesConfiguration' ist eine Eigenschaft Ihrer Beans, es gibt nichts zu aktualisieren, die Instanz aktualisiert sich selbst. –

+0

Sie sollten http://owner.aeonbits.org/ anstelle von PropertiesConfiguration suchen. –

4

Ich denke, es gibt keine übliche Möglichkeit, das zu tun. Am "saubersten" wäre es, den Spring-Kontext herunterzufahren und von Grund auf neu zu erstellen. Betrachten Sie zum Beispiel die Verwendung des DBCP-Verbindungspools und die Aktualisierung der Datenbankverbindungs-URL. Dies bedeutet, dass der Pool ordnungsgemäß heruntergefahren werden muss, dann muss ein neues Objekt erstellt werden und dann müssen alle Referenzen auf den Pool ebenfalls aktualisiert werden. Nun können einige Beans die Verbindung aus diesem Pool übernehmen, und das Aktualisieren der Pool-Konfiguration bedeutet, dass Sie Verbindungen irgendwie erneut anfordern müssen. Daher müssen die Beans möglicherweise wissen, wie das geht, was nicht üblich ist.

Ich würde vorschlagen, separate Bean mit Konfiguration und Update-Ereignisse zu erstellen, und diese Bean als Abhängigkeit für alle Beans setzen, die Sie über Konfigurationsänderungen wissen müssen. Dann können Sie die Apache Commons-Konfiguration zum Speichern von Dateiänderungen und zum Weiterleiten von Konfigurationsaktualisierungen verwenden.

Vielleicht verwenden Sie JMS ist gut (wenn Sie später Ihre App zu verteilen).

2

Ja, Sie können dies in Spring JMX Weise tun. Fügen Sie diese Beans zu Ihrer Spring-Konfigurationsdatei hinzu. Erstellen Sie eine separate Methode zum Lesen der Eigenschaftendatei. In diesem Beispiel verwende ich die Methode CallThisAgain().

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> 
    <property name="beans"> 
     <map> 
      <entry key="your.package.bean:name=sampleBeanService" value-ref="sampleService"/> 
     </map> 
    </property> 
    <property name="assembler"> 
     <bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"> 
      <property name="managedMethods"> 
       <value> 
        callThisAgain <!--Simply declare the method name here (only the name) --> 
       </value> 
      </property> 
     </bean> 
    </property> 
</bean> 

<bean class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="rmiRegistry"> 
    <property name="objectName" value="connector:name=rmi"/> 
    <property name="serviceUrl" value="service:jmx:rmi://127.0.0.1/jndi/rmi://127.0.0.1:11000/sample"/> 
</bean> 

<bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"> 
    <property name="port" value="11000"/> 
</bean> 

Danach können Sie Ihre Methode neu zu laden, ohne Server-Neustart verwenden jconsole zu.

0

Verwendung von Apache mit Feder wie folgt gemeinsam:

@Component 
public class ApplicationProperties { 
    private PropertiesConfiguration configuration; 

    @PostConstruct 
    private void init() { 
     try { 
      String filePath = "/opt/files/myproperties.properties"; 
      System.out.println("Loading the properties file: " + filePath); 
      configuration = new PropertiesConfiguration(filePath); 

      //Create new FileChangedReloadingStrategy to reload the properties file based on the given time interval 
      FileChangedReloadingStrategy fileChangedReloadingStrategy = new FileChangedReloadingStrategy(); 
      fileChangedReloadingStrategy.setRefreshDelay(60*1000); 
      configuration.setReloadingStrategy(fileChangedReloadingStrategy); 
     } catch (ConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String getProperty(String key) { 
     return (String) configuration.getProperty(key); 
    } 

    public void setProperty(String key, Object value) { 
     configuration.setProperty(key, value); 
    } 

    public void save() { 
     try { 
      configuration.save(); 
     } catch (ConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
0

Apache uns Dienstprogramm bieten aufladbare Eigenschaften zu verwenden Datei.

<bean id="propertiesReloadingStrategy" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"> 
    <property name="refreshDelay" value="30000" /> <!-- 30 seconds --> 
</bean> 

<bean id="reloadableProperties" class="org.apache.commons.configuration.PropertiesConfiguration"> 
    <constructor-arg value="file:/web/${weblogic.Domain}/${weblogic.Name}/${app.Name}/reloadable_cfg/Reloadable.properties"/> 
    <property name="reloadingStrategy" ref="propertiesReloadingStrategy"/> 
</bean> 
Verwandte Themen