Советы по использованию @ConfigurationProperties

задняя часть
Советы по использованию @ConfigurationProperties

В настоящее время Springboot является первым выбором для большинства разработчиков Java.В нашей повседневной работе у нас могут быть некоторые специальные конфигурации или самостоятельно разработанные фреймворки и модули, которые должны использовать пользовательскую конфигурацию application.yml.@valueАннотация для чтения файла конфигурации, теперь представьте более элегантный способ чтения файла конфигурации, используя@ConfigurationPropertiesаннотация

Аннотация @ConfigurationProperties

Мы моделируем сценарий подключения к сторонней системе. Нам часто нужно настроить такие параметры, как адрес другой стороны, некоторую информацию об интерфейсе и ключи шифрования. Давайте рассмотрим простейший случай следующим образом.

@ConfigurationProperties(prefix = "external")
@Getter
@Setter
@ToString
public class ExternalProperties { 
    private String baseUrl;
    
    private String privateKey;
}

Файл конфигурации содержит только самые основные типы,prefixУказывает префикс конфигурации, поэтому простейший класс конфигурации выполнен, но текущий класс конфигурации не вступит в силу, потому что его нужноКласс конфигурации передается в контейнер Spring для управленияЧтобы завершить автоматическую инъекцию конфигурации,Примечание. Должны быть методы получения и установки, есть два распространенных способа:

  1. @Компонентная аннотация

    пройти через@ComponentАннотация может превратить класс конфигурации в Spring bean-компонент, а также присоединиться к контейнеру Spring.Этот метод относительно прост, но его нельзя контролировать детально.Следует отметить, что для этого метода требуется Spring для сканирования класса конфигурации. Обычно используется метод@ComponentScanили@SpringBootApplicationАннотировать путь сканирования конфигурации,По умолчанию springboot начинает сканирование вниз с класса запуска, поэтому классу запуска не нужно выполнять специальную настройку на самом внешнем уровне, и ему требуется особое внимание только тогда, когда требуется более точное сканирование.

    @ConfigurationProperties(prefix = "external")
    @Getter
    @Setter
    @ToString
    @Component
    public class ExternalProperties {
    
        private String baseUrl;
    
        private String privateKey;
    }
    
  2. Аннотация @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>

image-20210616162142685.pngПроект перестройки автоматически сгенерирует файл spring-configuration-metadata.json, который будет автоматически запрашиваться при настройке

image-20210616162304884.png

image-20210616162732611.png

Класс конфигурации 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,Спасибо