2016-10-27 2 views
2

У меня есть приложение spring-boot. В папке запуска, имеется дополнительный конфигурационный файл:Как перезагрузить свойство @Value из application.properties весной?

dir/config/application.properties

При запуске приложения, он использует значения из файла и вводит их в:

@Value("${my.property}") 
private String prop; 

Вопрос: как я могу вызвать перезагрузку этих @Value свойств? Я хочу иметь возможность изменить конфигурацию application.properties во время выполнения и обновить поля @Value (возможно, это обновление, вызвав сервлет /reload внутри приложения).

Но как?

+0

Вы смотрели здесь HTTP : //stackoverflow.com/questions/27919270/set-override-spring-spring-boot-properties-at-runtime? – Mitchapp

+0

'spring-cloud' с' @ RefreshScope' на '@ Service' и запускает POST-запросы на' localhost: 8080/my-app/refresh' при изменении свойства. – membersound

ответ

2

Используйте следующий компонент для перезагрузки config.properties каждую секунду.

@Component 
public class PropertyLoader { 

    @Autowired 
    private StandardEnvironment environment; 

    @Scheduled(fixedRate=1000) 
    public void reload() throws IOException { 
     MutablePropertySources propertySources = environment.getPropertySources(); 
     PropertySource<?> resourcePropertySource = propertySources.get("class path resource [config.properties]"); 
     Properties properties = new Properties(); 
     InputStream inputStream = getClass().getResourceAsStream("/config.properties"); 
     properties.load(inputStream); 
     inputStream.close(); 
     propertySources.replace("class path resource [config.properties]", new PropertiesPropertySource("class path resource [config.properties]", properties)); 
    } 
} 

Ваш главный конфиг будет выглядеть примерно так:

@EnableScheduling 
@PropertySource("classpath:/config.properties") 
public class HelloWorldConfig { 
} 

вместо использования @value, каждый раз, когда вы хотите последнюю недвижимость вы будете использовать

environment.get("my.property"); 
Смежные вопросы