Обновление файла свойств, добавленного Spring, для добавления метки времени последнего запуска - PullRequest
3 голосов
/ 17 февраля 2012

У меня есть приложение, которое использует файл свойств, загруженный Spring.Экземпляр Properties затем внедряется в несколько классов.Вопрос в том, что некоторые из этих свойств обновлены - например, у нас есть отметка времени lastRun, которую мы хотим сохранить здесь.Может быть, есть лучший способ сохранить что-то вроде этого (предложения приветствуются), но как я могу обновить файл свойств?

<util:properties id="props" location="some.properties"/>

Метод props.store(...) требует либо записи, либо выводапоток (все, что я предполагаю, неизвестно, так как Spring обрабатывает эту загрузку) ..?

Есть ли лучший подход, или я просто должен передать путь к файлу из Spring context.xml и отправить его различным bean-компонентам и загрузить / сохранить файл свойств по старинке?

1 Ответ

6 голосов
/ 17 февраля 2012

PropertiesFactoryBean не имеет аксессора для свойства location, но вы можете получить свойство location из BeanDefinition.

BeanDefinition def = ctx.getBeanFactory().getBeanDefinition("props");
String location = def.getPropertyValues().getPropertyValue("location").getValue();
File file = ctx.getResource(location).getFile();

EDIT

Включить образец класса всделай это.Вы можете определить bean-компонент в bean-файле определения и ввести его в нужное место.

/**
 * Update Spring managed properties
 */
public class SpringPropertyUpdater implements ApplicationContextAware {

    private ConfigurableApplicationContext ctx;
    private static final String LOCATION_PROPERTY = "location";
    private static final Log log = LogFactory.getLog(SpringPropertyUpdater.class);

    /**
     * Update managed properties with new value
     */
    public void  updateProperties(String name, Properties props, String comments) {
        ConfigurableListableBeanFactory fb = ctx.getBeanFactory();
        BeanDefinition bf = fb.getBeanDefinition(name);
        String location = (String) bf.getPropertyValues().getPropertyValue(LOCATION_PROPERTY).getValue();
        Resource res = ctx.getResource(location);
        try {
            File file = res.getFile();
            props.store(new FileOutputStream(file), comments);
        } catch (IOException e) {
            log.error(e);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.ctx = (ConfigurableApplicationContext) applicationContext;

    }
}
...