Как получить доступ к значениям файла свойств в Spring Boot

Введение Свойства приложения могут отличаться в разных средах, например, как хосты в вашей среде контроля качества могут отличаться от ваших локальных и производственных сред. Используя Spring Boot, различные среды можно настраивать и обновлять отдельно, не затрагивая другие среды с использованием файлов свойств. В этой статье мы продемонстрируем способы доступа к значениям, определенным в файле свойств в проекте Spring Boot, и способы управления ими в коде. Пружинный ботинок

Вступление

Свойства приложения могут отличаться в разных средах, например, как хосты в вашей среде контроля качества могут отличаться от ваших локальных и производственных сред. Используя 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

@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 для хранения группы значений свойств.

comments powered by Disqus