Spring - замена значений свойств компонента в компонентах новыми значениями файла свойств

StackOverflow https://stackoverflow.com/questions/4084890

Вопрос

У меня есть файл свойств и используя держатель места пружинного свойства, я устанавливаю значения на пружинные бобы. Теперь этот файл свойства может быть изменен в течение времени выполнения. Есть ли способ обновить свойства весенней фасоли с этим недавно измененным значением свойства? Особенно у меня много синглтонских бобов? Как я могу обновить их с новыми значениями? Есть ли это решение для этого или должно быть настроен на заказ? Если это еще не существует, может кто-нибудь, пожалуйста, даст лучший подход к достижению этого? Спасибо!

PS: Мое приложение - это пакетное приложение. Я использую конфигурацию кварцевой конфигурации пружины для планирования партий.

Это было полезно?

Решение

Я оставлю это для справки, но обновленный ответ ниже разделителя:

Хорошо ConfigurableApplicationContext Интерфейс содержит А. Обновить () Метод, который должен быть тем, что вы хотите, но вопрос в том, как получить доступ к этому методу. Какой бы вы ни делали это, вы начнете с фасоли, который имеет зависимость типа ConfigurableApplicationContext:

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

Теперь два основных варианта, которые я бы предложил, было бы либо

  1. использовать Рамки выполнения задач И позвольте вашу фасоль регулярно наблюдать за ресурсами имущества, обновляя ApplicationContext, когда он находит изменения или
  2. выставлять боб в jmx, позволяя вам вручную вызвать обновление.

Ссылаясь на комментарии: поскольку кажется, что невозможно обновить весь контекст, альтернативная стратегия будет создана заводской фасолью свойств и ввести, что во всех других бобах.

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;
    }

}

Однако вы можете ввести эту свойства бобы во всех других бобах, однако, вам придется быть осторожным, чтобы всегда использовать прототип массу. Это особенно сложно внутри Singleton Beans, Решение можно найти здесь.

Если вы не хотите вводить методы поиска по всему места, вы также можете ввести PropertyProvider боб, как это:

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);
    }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top