Frage

Ich habe eine Eigenschaftsdatei und mit Spring Eigenschaft Platzhalter, habe ich Werte auf den Spring-Beans. Nun kann diese Eigenschaft Datei während der Laufzeit geändert werden. Gibt es eine Möglichkeit, die Eigenschaften des Spring-Beans mit diesem neu modifizierten Eigenschaftswert zu aktualisieren? Vor allem habe ich viele Singletons Bohnen? Wie kann ich sie mit den neuen Werten aktualisieren? Gibt es bereits eine Lösung für dieses oder sollte es benutzerdefinierte codiert werden? Wenn es nicht bereits vorhanden ist, kann jemand bitte den besten Ansatz geben, dies zu erreichen? Dank!

PS: Meine Anwendung ist eine Batch-Anwendung. Ich benutze Frühling Basis Quarz Konfiguration der Chargen zu planen.

War es hilfreich?

Lösung

Ich werde dies lassen als Referenz, aber die aktualisierte Antwort ist unter dem Teiler:

Nun, die ConfigurableApplicationContext Schnittstelle enthält ein refresh () Verfahren, das sein sollte, was Sie wollen, aber die Frage ist: wie man Zugang dieser Methode. Je nachdem, wie Sie es tun, werden Sie mit einer Bohne starten, die eine Abhängigkeit vom Typ ConfigurableApplicationContext hat:

private ConfigurableApplicationContext context;
@Autowired
public void setContext(ConfigurableApplicationContext ctx){
    this.context = ctx;
}

Nun werden die beiden grundlegenden Optionen, die ich würde vorschlagen, entweder würde

  1. verwenden, um die Taskausführung Rahmen und lassen sie Ihre Bohne regelmäßig die Eigenschaft Ressourcen sehen, Auffrischen der Application, wenn es Änderungen findet oder
  2. aussetzen die Bean JMX , so dass Sie manuell die Refresh auslösen.

Mit Bezug auf Kommentare., Da es unmöglich scheint, den gesamten Kontext zu aktualisieren, eine alternative Strategie eine Eigenschaft Fabrik Bohne und spritzen zu schaffen wäre, dass in alle anderen Bohnen

public class PropertiesFactoryBean implements FactoryBean<Properties>{

    public void setPropertiesResource(Resource propertiesResource){
        this.propertiesResource = propertiesResource;
    }

    private Properties value=null;
    long lastChange = -1L;

    private Resource propertiesResource;

    @Override
    public Properties getObject() throws Exception{
        synchronized(this){
            long resourceModification = propertiesResource.lastModified();
            if(resourceModification != lastChange){
                Properties newProps = new Properties();
                InputStream is = propertiesResource.getInputStream();
                try{
                    newProps.load(is);
                } catch(IOException e){
                    throw e;
                } finally{
                    IOUtils.closeQuietly(is);
                }
                value=newProps;
                lastChange= resourceModification;
            }
        }
        // you might want to return a defensive copy here
        return value;
    }

    @Override
    public Class<?> getObjectType(){
        return Properties.class;
    }

    @Override
    public boolean isSingleton(){
        return false;
    }

}

Sie können diese Eigenschaften Bohne in allen anderen Bohnen injizieren, jedoch würde man vorsichtig sein muss immer Prototyp Bereich verwenden. Dies ist besonders heikel innerhalb Singletons Bohnen, kann eine Lösung gefunden werden hier .

Wenn Sie nicht wollen, Methoden injizieren Lookup ganz über dem Platz, man konnte auch inject eine PropertyProvider Bohne wie folgt aus:

public class PropertiesProvider implements ApplicationContextAware{

    private String propertyBeanName;
    private ApplicationContext applicationContext;

    public void setPropertyBeanName(final String propertyBeanName){
        this.propertyBeanName = propertyBeanName;
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException{
        this.applicationContext = applicationContext;
    }

    public String getProperty(final String propertyName){
        return ((Properties) applicationContext.getBean(propertyBeanName)).getProperty(propertyName);
    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top