В настоящее время Springboot является первым выбором для большинства разработчиков Java.В нашей повседневной работе у нас могут быть некоторые специальные конфигурации или самостоятельно разработанные фреймворки и модули, которые должны использовать пользовательскую конфигурацию application.yml.@valueАннотация для чтения файла конфигурации, теперь представьте более элегантный способ чтения файла конфигурации, используя@ConfigurationPropertiesаннотация
Аннотация @ConfigurationProperties
Мы моделируем сценарий подключения к сторонней системе. Нам часто нужно настроить такие параметры, как адрес другой стороны, некоторую информацию об интерфейсе и ключи шифрования. Давайте рассмотрим простейший случай следующим образом.
@ConfigurationProperties(prefix = "external")
@Getter
@Setter
@ToString
public class ExternalProperties {
private String baseUrl;
private String privateKey;
}
Файл конфигурации содержит только самые основные типы,prefixУказывает префикс конфигурации, поэтому простейший класс конфигурации выполнен, но текущий класс конфигурации не вступит в силу, потому что его нужноКласс конфигурации передается в контейнер Spring для управленияЧтобы завершить автоматическую инъекцию конфигурации,Примечание. Должны быть методы получения и установки, есть два распространенных способа:
-
@Компонентная аннотация
пройти через
@ComponentАннотация может превратить класс конфигурации в Spring bean-компонент, а также присоединиться к контейнеру Spring.Этот метод относительно прост, но его нельзя контролировать детально.Следует отметить, что для этого метода требуется Spring для сканирования класса конфигурации. Обычно используется метод@ComponentScanили@SpringBootApplicationАннотировать путь сканирования конфигурации,По умолчанию springboot начинает сканирование вниз с класса запуска, поэтому классу запуска не нужно выполнять специальную настройку на самом внешнем уровне, и ему требуется особое внимание только тогда, когда требуется более точное сканирование.@ConfigurationProperties(prefix = "external") @Getter @Setter @ToString @Component public class ExternalProperties { private String baseUrl; private String privateKey; } -
Аннотация @EnableConfigurationProperties
После Spring Boot 2.2 при условии
@EnableConfigurationPropertiesаннотировать иvalueУстановить как{ExternalProperties.class}следующим образом:@SpringBootApplication @EnableConfigurationProperties({ExternalProperties.class}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }Пока кажется, что это
@ComponentНе большая разница, но@EnableConfigurationPropertiesтакже можно отметить в@Configurationкласс, подходитSpring BootС помощью функции автоматической настройки мы можем настроить файл по мере необходимости следующим образом:@Configuration @EnableConfigurationProperties({ExternalProperties.class}) public class ExternalAutoConfiguration { }Файл spring.factories настроен следующим образом:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.config.ExternalAutoConfigurationТаким образом, класс конфигурации вступит в силу только при автоматической настройке ExternalAutoConfiguration.Этот метод часто является небольшим трюком, используемым пользовательскими модулями или фреймворками.Если вы не понимаете автоматическую настройку Springboot, простое объяснение состоит в том, что Spring настроит spring.factories Классы загружаются автоматически.
application.yml настраивается следующим образом:
external:
base-url: 'http://127.0.0.1:8080'
private-key: 'custom'
Запустите проект и просто распечатайте класс конфигурации, чтобы получить:
ExternalProperties(baseUrl=http://127.0.0.1:8080, privateKey=custom)
На этом самый простой класс настройки завершен, далее я представлю некоторые сопутствующие знания, в которых легко ошибиться и более практические навыки в работе.
Правила расслабленной привязки Spring (ослабленная привязка)
Некоторые читатели могли заметить, что приведенный выше базовый URL-адрес конфигурации использует формат kebab-case, а класс конфигурации использует формат camelCased, но Spring по-прежнему может точно присваивать значения baseUrl, поскольку Spring принимает свободные правила привязки, следующие Конфигурация может вступить в силу:
external:
base-url: 'http://127.0.0.1:8080'
base_url: 'http://127.0.0.1:8080'
baseUrl: 'http://127.0.0.1:8080'
baseurl: 'http://127.0.0.1:8080'
BASE-URL: 'http://127.0.0.1:8080'
BASEURL: 'http://127.0.0.1:8080'
общий синтаксис yaml
#纯量
demo:
int: 1
string: 'demo'
boolea: true
float: 1.2
date: 2021-06-16
#数组或者list ['1','2','3']
demo:
list:
- '1'
- '2'
- '3'
#对象或map,下面配置对应{key1: '1', key2: '2'}
demo:
map:
key1: '1'
key2: '2'
#或者
demo:
map: {key1: '1', key2: '2'}
#复杂的数组对象 [{key1:'1',key2:'2'},{key1:'3',key2:'4'}]
demo:
- key1: '1'
key2: '2'
- key1: '3'
key2: '4'
#或者
demo:
- {key1: '1', key2: '2'}
- {key1: '3', key2: '4'}
недопустимый элемент конфигурации
Теперь мы добавляем включенный элемент конфигурации логического типа и настраиваем его следующим образом.
@ConfigurationProperties(prefix = "external")
@Getter
@Setter
@ToString
public class ExternalProperties {
private boolean enabled;
private String baseUrl;
private String privateKey;
}
external:
enabled: error
private-key: 'custom'
base-url: 'http://127.0.0.1:8080'
Когда мы запустим проект, мы получим следующую ошибку, что означает элемент конфигурации в строке 11.external.enabledизvalueЭто строка «ошибка», которую нельзя преобразовать в логический тип, поэтому вам нужно обратить внимание на тип конфигурации во время разработки, и вы можете быстро найти место ошибки и проанализировать причину ошибки.
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to bind properties under 'external.enabled' to boolean:
Property: external.enabled
Value: error
Origin: class path resource [application.yml] - 11:12
Reason: failed to convert java.lang.String to boolean
Action:
Update your application's configuration
Если мы хотим, чтобы Spring не запускался из-за неправильной конфигурации, мы можем использоватьignoreInvalidFields=trueнастроить, ноОбычно это не рекомендуется, приведет к тому, что некоторые ошибки не могут быть обнаружены вовремя, что может привести к производственным авариям
@ConfigurationProperties(prefix = "external", ignoreInvalidFields = true)
@Getter
@Setter
@ToString
public class ExternalProperties {
private boolean enabled;
private String baseUrl;
private String privateKey;
}
Встроенная конфигурация
Мы можем выполнить встроенную настройку со списками, картами и классами,
Для классов Spring рекомендуется поместить его в класс конфигурации и использовать внутренний класс для настройки.Теперь мы добавляем конфигурацию интерфейса и количество повторных попыток при сбое каждого интерфейса.Примечание. Внутренний класс должен быть статическим, иначе конфигурация не вступит в силу.,следующим образом
@ConfigurationProperties(prefix = "external", ignoreInvalidFields = true)
@Getter
@Setter
@ToString
public class ExternalProperties {
private boolean enabled;
private String baseUrl;
private String privateKey;
private List<Api> apis;
@Getter
@Setter
@ToString
@Component
public static class Api{
private String url;
private int retry;
}
}
external:
enabled: true
private-key: 'custom'
base-url: 'http://127.0.0.1:8080/'
apis:
- url: '/token'
retry: 3
- url: '/users'
retry: 2
Запустите проект, распечатайте класс конфигурации
ExternalProperties(enabled=true, baseUrl=http://127.0.0.1:8080/, privateKey=custom, apis=[ExternalProperties.Api(url=/token, retry=3), ExternalProperties.Api(url=/users, retry=2)])
Иногда мы хотим создать отдельный класс для сложной конфигурации, то есть спроектировать класс Api как отдельный класс, разница в этом заключается в использованииspring-boot-configuration-processorПри генерации автоматических подсказок нам нужно@NestedConfigurationPropertyАтрибуты тега аннотации, автоматическая настройка будет обсуждаться позже
автоподсказка
Внедрение зависимостей и включение обработки аннотаций идеи
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
Проект перестройки автоматически сгенерирует файл spring-configuration-metadata.json, который будет автоматически запрашиваться при настройке
Класс конфигурации API, о котором мы упоминали ранее, разработан как отдельный класс конфигурации, и связанная с ним конфигурация spring-configuration-metadata.json не будет создана во время перестроения.На данный момент нам нужно добавить@NestedConfigurationPropertyАннотации, кроме списка и карты, следующие
@ConfigurationProperties(prefix = "external", ignoreInvalidFields = true)
@Getter
@Setter
@ToString
public class ExternalProperties {
private boolean enabled;
private String baseUrl;
private String privateKey;
private List<Api> apis;
@NestedConfigurationProperty
private Api api;
}
На этом введение и использование @ConfigurationProperties закончено. Если у вас есть какие-либо вопросы, вы можете задать их. Если у вас есть какие-либо ошибки, отправьте электронное письмо по адресуyp.yang7@foxmail.com,Спасибо