Автор оригинала: Rayven Yor Esplanada.
Вступление
Свойства приложения могут отличаться в разных средах, например, как хосты в вашей среде QA могут отличаться от вашей локальной и производственной сред. Используя Spring Boot, различные среды можно настраивать и обновлять отдельно, не влияя на другие среды с помощью файлов свойств .
В этой статье мы продемонстрируем способы доступа к значениям, определенным в файле свойств в проекте Spring Boot, и способы управления ими в коде.
Файлы свойств весенней Загрузки
Spring Boot предоставляет способ экстернализации конфигураций с использованием файлов свойств, расположенных в пути к классам проекта. Это очень полезно для настройки нескольких сред, чтобы свойства можно было динамически настраивать для каждой среды.
Файл свойств по умолчанию, создаваемый Spring Boot, называется application.properties и находится в каталоге src/main/resources/ проекта. При инициализации проекта файл свойств по умолчанию пуст.
Вот пример файла application.properties , содержащего два примера свойств:
spring.datasource.username=user logging.level.root=INFO
Этот пример файла содержит значения для имени пользователя источника данных и корневого уровня ведения журнала приложения. Свойства следуют одному и тому же синтаксису ключ=значение .
Файлы свойств YAML
В качестве альтернативы, вместо синтаксиса .properties по умолчанию, Spring Boot также поддерживает файлы свойств в формате YAML. Поэтому вместо файла по умолчанию application.properties вы можете создать новый файл свойств application.yml , если вы предпочитаете, чтобы ваши свойства были в формате YAML:
spring:
datasource:
username: user
logging:
level:
root: INFO
Единственное различие, которое это повлечет за собой, – это форматирование содержимого файла, поэтому выбор основан исключительно на предпочтениях.
Spring Boot позволяет объявлять несколько файлов свойств с помощью аннотации @PropertySource , определенной с помощью класса конфигурации.
Доступ к значениям в Файлах свойств при весенней загрузке
Теперь мы переходим к основной теме, которая заключается в том, как получить доступ к значениям в вышеупомянутых файлах свойств.
Использование аннотации @Value
Аннотация @Value -это предварительно определенная аннотация, используемая для чтения значений из любых файлов свойств в пути к классам проекта.
Чтобы получить доступ к значению одного свойства из файла свойств с помощью этой аннотации, вы указываете имя свойства в качестве аргумента:
@Value("${spring.sample.property}")
Следуя этому синтаксису, давайте рассмотрим пример, в котором мы устанавливаем значение строковой переменной в datasource.username , определенное в файле свойств в приведенном выше примере:
@Value("${spring.datasource.username}")
String username;
Если мы напечатаем приведенную выше переменную без каких-либо дальнейших манипуляций, результатом должно быть значение указанного свойства, объявленного в аннотации @Value . В этом случае он должен распечатать строку пользователь :
System.out.println(username); // user
Если свойство, объявленное в аннотации, не существует ни в одном файле свойств, то будет соблюдена инициализация типа данных по умолчанию. В этом случае переменная имя пользователя будет иметь значение null .
Обновление значения переменной, аннотированной аннотацией @Value , также изменяет фактическое значение свойства, введенного в переменную во время выполнения:
username = "new_user"
Это изменяет значение переменной имя пользователя , а также временно изменяет значение свойства spring.datasource.имя пользователя .
Обратите внимание, что изменения, внесенные во время выполнения, будут сброшены, как только программа перестанет работать, поэтому изменения не будут отражены в фактическом файле свойств. Это означает, что значения свойств являются более динамичными, а не просто постоянными значениями.
Вот ссылка на наше подробное руководство по аннотации @Value, если вы хотите узнать об этом больше.
Использование объекта среды
Другим способом доступа к значениям, определенным в Spring Boot, является автоматическое подключение объекта Environment и вызов метода getProperty() для доступа к значению файла свойств.
Метод getProperty() принимает один обязательный параметр, представляющий собой строку, содержащую имя свойства, и возвращает значение этого свойства, если оно существует. Если свойство не существует, метод вернет значение null .
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Для этого примера давайте обратимся к журналу .свойство level.root и сохраните его в строковом значении:
@Autowired
private Environment env;
public void getRootLogLevel() {
return env.getProperty("logging.level.root");
}
Если метод getRoot Log Level() вызван и распечатан, он выведет значение свойства, если оно существует. С помощью файла свойств примера, указанного выше, этот метод должен выводить INFO .
Использование аннотации @ConfigurationProperties
Аннотация @ConfigurationProperties является более широким подходом, чем аннотация @Value и объект Среда .
Этот метод используется для доступа к связанным группам свойств путем сохранения конфигурации в POJO (обычный старый объект Java) и использования POJO для дальнейшего доступа, в отличие от предыдущих решений, в которых доступ к свойствам осуществляется индивидуально.
В аннотации @ConfigurationProperties будут отображаться значения, заданные префиксом группы свойств.
Для этого решения давайте создадим новый файл application.properties :
spring.demo.username=user spring.demo.password=password spring.demo.email=[email protected]
Все 3 свойства, настроенные в файле, имеют один и тот же префикс spring.demo .
Теперь давайте создадим класс конфигурации для отображения значений этих свойств с помощью аннотации @ConfigurationProperties .
Обратите внимание , что помимо аннотирования класса с помощью @ConfigurationProperties , вам также необходимо аннотировать его с помощью @Configuration , чтобы сообщить системе, что класс является классом конфигурации.
Кроме того, имена переменных в классе должны совпадать с именами в файле свойств с заданным префиксом. Давайте создадим Демонстрационные свойства класс:
@Configuration
public class DemoProperties {
private String username;
private String password;
private String email;
// Getters, Setters, Constructors, etc...
}
Теперь, когда конфигурация объявлена, экземпляр Демонстрационные свойства можно использовать в любом месте уровня сервиса для доступа к значениям свойств, просто подключив класс автоматически:
@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());
}
Вызов метода print Demo Properties() выведет:
Username: user Password: password Email Address: [email protected]
Вывод
В этой статье рассматриваются три различных способа доступа к значению, определяемому в Spring Boot. Все это довольно легко понять и применить к вашим проектам!
Аннотация @Value является наиболее часто используемым решением для доступа к значениям свойств в Spring Boot. Объект Среда используется не так часто, но все же является жизнеспособным способом доступа к значению свойства.
Аннотация @ConfigurationProperties является немного более полной и должна использоваться только для больших групп свойств, которые имеют один и тот же префикс и один и тот же контекст, поскольку вам потребуется адаптировать это решение, создав POJO для хранения группы значений свойств.