Вступление
Свойства приложения могут отличаться в разных средах, например, как хосты в вашей среде контроля качества могут отличаться от ваших локальных и производственных сред. Используя Spring Boot, различные среды можно настраивать и обновлять отдельно, не влияя на другие среды с использованием файлов свойств .
В этой статье мы продемонстрируем способы доступа к значениям, определенным в файле свойств в проекте Spring Boot, и способы управления ими в коде.
Файлы свойств Spring Boot
Spring Boot предоставляет способ экстернализации конфигураций с использованием файлов свойств, которые находятся в пути к классам проекта. Это очень полезно для настройки нескольких сред, так что свойства можно динамически настраивать для каждой среды.
Файл свойств по умолчанию, который генерирует Spring Boot, называется
application.properties
и находится в каталоге src/main/resources/
При инициализации проекта файл свойств по умолчанию остается пустым.
Вот пример application.properties
содержащего два примера свойств:
spring.datasource.username=user
logging.level.root=INFO
Этот образец файла содержит значения для имени пользователя datasource
и корневого уровня ведения журнала приложения. Свойства следуют
одинаковому синтаксису key=value
Файлы свойств YAML
В качестве альтернативы, вместо .properties
по умолчанию, Spring Boot
также поддерживает файлы свойств в формате YAML. Поэтому вместо
application.properties
по умолчанию вы можете создать новый файл
свойств application.yml
если вы предпочитаете свои свойства в формате
YAML:
spring:
datasource:
username: user
logging:
level:
root: INFO
Единственное различие, которое это повлечет за собой, - это форматирование содержимого в файле, поэтому выбор основан исключительно на предпочтениях.
Spring Boot позволяет объявлять несколько файлов свойств с помощью аннотации @PropertySource, определенной через класс конфигурации.
Доступ к значениям в файлах свойств в Spring Boot
Теперь мы переходим к основной теме - как получить доступ к значениям в вышеупомянутых файлах свойств.
Использование аннотации @Value
@Value
- это предварительно определенная аннотация, используемая для
чтения значений из любых файлов свойств в пути к классам проекта.
Чтобы получить доступ к отдельному значению свойства из файла свойств с помощью этой аннотации, вы указываете имя свойства в качестве аргумента:
@Value("${spring.sample.property}")
Следуя этому синтаксису, давайте рассмотрим пример, в котором мы
устанавливаем значение строковой переменной равным datasource.username
определенному в файле свойств в приведенном выше примере:
@Value("${spring.datasource.username}")
String username;
Если мы напечатаем указанную выше переменную без каких-либо дальнейших
манипуляций, на выходе должно быть значение указанного свойства,
объявленного в аннотации @Value
В этом случае он должен распечатать
строку user
:
System.out.println(username);
// user
Если свойство, объявленное в аннотации, не существует в каком-либо файле
свойств, то будет соблюдаться инициализация типа данных по умолчанию. В
этом случае для переменной username
будет установлено значение null
.
Обновление значения переменной, @Value
также изменяет фактическое
значение свойства, введенного в переменную во время выполнения:
username = "new_user"
Это изменяет значение переменной username
а также временно изменяет
значение свойства spring.datasource.username
.
Обратите внимание, что изменения, сделанные во время выполнения, будут сброшены, как только программа остановится, поэтому изменения не будут отражены в фактическом файле свойств. Это означает, что значения свойств более динамичны, а не просто постоянны.
Вот ссылка на наше подробное руководство по аннотации
@Value
если вы
хотите узнать об этом больше.
Использование объекта среды
Другой метод доступа к значениям, определенным в Spring Boot, - это
автоматическое подключение
Environment
и вызов getProperty()
для доступа к значению файла свойств.
Метод getProperty()
принимает единственный обязательный параметр,
который представляет собой строку, содержащую имя свойства, и возвращает
значение этого свойства, если оно существует. Если свойство не
существует, метод вернет null
значение.
В этом примере давайте logging.level.root
свойству logging.level.root
и сохраним его в строковом значении:
@Autowired
private Environment env;
public void getRootLogLevel() {
return env.getProperty("logging.level.root");
}
Если getRootLogLevel()
, он распечатывает значение свойства, если оно
существует. В приведенном выше примере файла свойств этот метод должен
выводить INFO
.
Использование аннотации @ConfigurationProperties
- более обширный подход, чем аннотация
@Value
и объектEnvironment
Этот метод используется для доступа к связанным группам свойств путем сохранения конфигурации в POJO (обычный старый объект Java) и использования POJO для дальнейшего доступа, в отличие от предыдущих решений, где доступ к свойствам осуществляется индивидуально.
@ConfigurationProperties
будет отображать значения с учетом префикса
группы свойств.
Для этого решения создадим новый файл application.properties
spring.demo.username=user
spring.demo.password=password
[email protected]
Все 3 свойства, настроенные в файле, имеют одинаковый префикс
spring.demo
.
Теперь давайте создадим класс конфигурации для сопоставления значений
этих свойств с @ConfigurationProperties
аннотации
@ConfigurationProperties.
Обратите внимание, что помимо аннотации класса с помощью
@ConfigurationProperties
, вам также необходимо аннотировать его с
помощью @Configuration
чтобы сообщить системе, что класс является
классом конфигурации.
Кроме того, имена переменных в классе должны совпадать с именами в файле
свойств с заданным префиксом. DemoProperties
класс DemoProperties:
@ConfigurationProperties(prefix="spring.demo")
@Configuration
public class DemoProperties {
private String username;
private String password;
private String email;
// Getters, Setters, Constructors, etc...
}
Теперь, когда конфигурация объявлена, DemoProperties
можно
использовать в любом месте на уровне сервиса для доступа к значениям
свойств, просто автоматически подключив класс:
@Autowired
private DemoProperties demoProperties;
public void printDemoProperties() {
System.out.println("Username: " + demoProperties.getUsername());
System.out.println("Password: " + demoProperties.getPassword());
System.out.println("Email Address: " + demoProperties.getEmail());
}
Вызов printDemoProperties()
выведет:
Username: user
Password: password
Email Address: [email protected]
Заключение
В этой статье рассмотрены три различных способа доступа к определениям значений в Spring Boot. Все это довольно легко понять и применить в своих проектах!
@Value
- это наиболее часто используемое решение для доступа к
значениям свойств в Spring Boot. Объект Environment
используется не
так часто, но по-прежнему является жизнеспособным способом доступа к
значению свойства.
@ConfigurationProperties
является немного более полной и должна
использоваться только для больших групп свойств с одинаковым префиксом и
одним и тем же контекстом, поскольку вам нужно будет приспособить это
решение, создав POJO для хранения группы значений свойств.