Часто нам необходимо помещать часто используемые конфигурационные данные, такие как конфигурация OSS Alibaba Cloud, данные для отправки SMS и т.д., в конфигурационные файлы.
Давайте рассмотрим, какие способы предоставляет Spring для чтения этих конфигурационных данных из конфигурационных файлов.
Содержимое файла application.yml
:
wuhan2020: В начале 2020 года в Ухане произошел всплеск новой коронавирусной инфекции, ситуация была серьезной, но я верю, что все это пройдет! Ухань, держись! Китай, держись!
my-profile:
name: Guide哥
email: koushuangbwcx@163.com
library:
location: Ухань, держись! Китай, держись!
books:
- name: Базовые законы гения
description: В 22 года Лин Чжаокси узнала, что её отец был диагностирован с болезнью Альцгеймера, в тот же день она узнала, что её любимый наставник Пэй Чжи собирается уехать за границу для обучения — в ту самую школу, которую её отец отказался посещать ради неё.
- name: Порядок времени
description: Почему мы помним прошлое, а не будущее? Что означает "проходит" время? Мы существуем внутри времени, или время существует внутри нас? Карло Ровелли использует поэтический язык, чтобы пригласить нас задуматься над этой вечной проблемой — сущность времени.
- name: Великолепный я
description: Как выработать новый привычный образ мышления? Как сделать свой ум более зрелым? Как иметь высококачественные отношения? Как выйти из трудного периода жизни?
В этом тексте переведены китайские фразы и оставлены без изменений технические элементы и структура файла application.yml
.### 1. Чтение простых конфигурационных данных с помощью @value
Используем @Value("${property}")
для чтения простых конфигурационных данных:
@Value("${wuhan2020}")
String wuhan2020;
Важно отметить, что использование
@value
не рекомендуется. Spring рекомендует использовать следующие способы чтения конфигурационных данных.
@ConfigurationProperties
и связывание с beanКласс
LibraryProperties
помечен аннотацией@Component
, что позволяет использовать его как обычный bean.
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix = "library")
@Setter
@Getter
@ToString
class LibraryProperties {
private String location;
private List<Book> books;
}
@@Setter
@@Getter
@ToString
static class Book {
String name;
String description;
}
}
Когда вы закончите, вы сможете использовать этот бин так же, как обычный бин, внедряя его в класс:
package cn.javaguide.readconfigproperties;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author shuang.kou
*/
@SpringBootApplication
public class ReadConfigPropertiesApplication implements InitializingBean {
private final LibraryProperties library;
public ReadConfigPropertiesApplication(LibraryProperties library) {
this.library = library;
}
public static void main(String[] args) {
SpringApplication.run(ReadConfigPropertiesApplication.class, args);
}
}
``` @Override
public void afterPropertiesSet() {
System.out.println(library.getLocation());
System.out.println(library.getBooks());
}
}
Вывод в консоль:
Хубэй, Ухань, дай фу, Китай, дай фу
[LibraryProperties.Book(name=Талант базовые законы, description........]
@ConfigurationProperties
Сначала измените application.yml
на следующий формат, который явно не является правильным форматом email:
my-profile:
name: Гайд哥
email: koushuangbwcx@
Класс
ProfileProperties
не аннотирован как@Component
. Мы регистрируем наш конфигурационный бин с помощью@EnableConfigurationProperties
там, где нам нужно использоватьProfileProperties
:
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
/**
* @author shuang.kou
*/
@Getter
@Setter
@ToString
@ConfigurationProperties("my-profile")
@Validated
public class ProfileProperties {
@NotEmpty
private String name;
@Email
@NotEmpty
private String email;
// Если значение не было прочитано из конфигурационного файла, используется значение по умолчанию
private Boolean handsome = Boolean.TRUE;
}
Конкретное использование:
package cn.javaguide.readconfigproperties;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
/**
* @author shuang.kou
*/
@SpringBootApplication
@EnableConfigurationProperties(ProfileProperties.class)
public class ReadConfigPropertiesApplication implements InitializingBean {
private final ProfileProperties profileProperties;
}
``` public ReadConfigPropertiesApplication(ProfileProperties profileProperties) {
this.profileProperties = profileProperties;
}
public static void main(String[] args) {
SpringApplication.run(ReadConfigPropertiesApplication.class, args);
}
@Override
public void afterPropertiesSet() {
System.out.println(profileProperties.toString());
}
}
Поскольку формат нашего электронного адреса неверен, при запуске программы возникает ошибка, и программа не запускается. Это гарантирует безопасность типов данных:
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'my-profile' to cn.javaguide.readconfigproperties.ProfileProperties failed:
Property: my-profile.email
Value: koushuangbwcx@
Origin: class path resource [application.yml]:5:10
Reason: must be a well-formed email address
После того как мы изменили тестовый электронный адрес на правильный, при запуске программа успешно выводит прочитанные данные:
ProfileProperties(name=Guide哥, email=koushuangbwcx@163.com, handsome=true)
@PropertySource
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:website.properties")
@Getter
@Setter
class WebSite {
@Value("${url}")
private String url;
}
Использование:
@Autowired
private WebSite webSite;
System.out.println(webSite.getUrl());//https://javaguide.cn/
Spring также имеет приоритет загрузки конфигурационных файлов, вот схема:
Для более подробной информации обратитесь к официальной документации: https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
Исходный код данной статьи: https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/чтение-конфигурационных-свойств
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )