В этой статье мы рассмотрим, как задать свойства Spring Boot приложения в файле application.properties, а также как получить доступ ко всем свойствам (не только заданным в application.properties) из приложения во время его работы.
Источники свойств
Spring Boot приложение может обращаться к свойствам из внешних источников:
- переменным среды ОС,
- к Java System Properties,
- к специальным свойствам Spring Boot приложения, заданным в application.properties.
- и многим другим — всего более десятка источников
Все эти свойства во время работы приложения собираются в бине Environment. Если внедрить бин Environment, то в режиме отладки можно посмотреть все эти списки свойств:
Мы для примера попробуем добавить и вывести одно свойство System Properties и пару свойств application.properties. Чаще всего используется именно application.properties.
application.properties
Зададим в application.properties пару свойств:
app.n=1 app.m=2
System Properties
Чтобы задать System Property, на вкладке Run Configuration пропишем VM options:
-Dprop1=prop1
Пока хватит.
Теперь рассмотрим, как получить доступ к этим свойствам из кода.
Доступ к свойствам
Можно внедрить отдельное свойство с помощью @Value. Также можно внедрить же целую серию свойств с помощью класса
Внедрение свойства с помощью @Value
Чтобы внедрить свойство в помощью @Value, используем ${…}:
@SpringBootApplication public class MainApplication { @Value("${app.n}") private int n; @Value("${app.m}") private int m; @Value("${prop1}") private String prop1; @Value("${TEMP}") private String temp; @PostConstruct void print(){ System.out.println(n); System.out.println(m); System.out.println(temp); System.out.println(prop1); } public static void main(String[] args) throws InterruptedException { SpringApplication.run(MainApplication.class, args); } }
Мы внедрили свойства:
- из application.properties
- и переменную среды TEMP
- System Property, заданное в VM options
В консоли выводятся значения:
1 2 C:\Users\myluc\AppData\Local\Temp prop1
@ConfigurationProperties
Можно также выделить серию свойств из файла application.properties и создать для нее отдельный класс, который можно внедрять. На первый взгляд такой вариант кажется сложнее, но он подходит, если свойств много.
Например, выделим из application.properties свойства, начинающиеся с app (у нас это все свойства, других нет):
app.n=1 app.m=2
Создадим под них класс AppProperties:
@Configuration @ConfigurationProperties(prefix = "app") public class AppProperties { private int n; private int m; //getters/setters }
Класс аннотирован @Configuration и @ConfigurationProperties, и внутри указан префикс app — это означает, что в AppProperties внедрятся свойства, начинающиеся с app.
Теперь бин AppProperties будет содержать свойства из application.properties. Его можно внедрять и через него получать свойства как поля бина:
@SpringBootApplication public class MainApplication { @Autowired private AppProperties appProperties; @PostConstruct void print(){ System.out.println(appProperties.getN()); System.out.println(appProperties.getM()); } public static void main(String[] args) throws InterruptedException { SpringApplication.run(MainApplication.class, args); } }
Это альтернатива аннотации @Value.
Итоги
Мы рассмотрели, откуда берутся свойства для Spring Boot приложения и как получить к ним доступ. Код примера есть на GitHub.