Springboot получает информацию о конфигурации элегантной практики

Spring Boot Java
Springboot получает информацию о конфигурации элегантной практики

Мне нечего делать, и когда я смотрю на исходный код, я нахожу, что практика Springboot в получении информации о конфигурации очень элегантна, и ей стоит подражать.
ранее представленныйОсведомленный семейный интерфейсНа самом деле, я упомянул решение получения информации о конфигурации, но будь то реализация интерфейса EnvironmentAware или непосредственное внедрение bean-компонента Environment, это по сути одно и то же, и невозможно получить множественную информацию о конфигурации.

// 本文借鉴了以下源码
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.http.HttpProperties

Сначала создайте файл свойств

Следующие три свойства определены с помощью spring.customize в качестве префикса.

Определить JavaBean на основе атрибутов

@ConfigurationProPerties Annotations может напрямую подтвердить сопоставление взаимоотношений между имуществом JavaBean и информацией о конфигурации, а также с ... вспомогательная форма аннотированного префикса используется для указания префикса информации о конфигурации, которая должна быть сопоставлена. В коде я не указывал информацию префикса как «Spring.Customize», но указана как «Spring», вот код, основанный на уровне кода.CustomizePropertiesНа самом деле, он также содержит статический внутренний классCustomize.Официальная документация (B3.1)Есть четкое описание собственных свойств и их вложенных свойств.

package com.springboot.autoconfigure.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "spring")
public class CustomizeProperties {

    private final Customize customize = new Customize();

    public Customize getCustomize() {
        return customize;
    }

    public static class Customize {
        private String address;
        private String port;
        private boolean enable;

        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        public String getPort() {
            return port;
        }
        public void setPort(String port) {
            this.port = port;
        }

        public boolean isEnable() {
            return enable;
        }
        public void setEnable(boolean enable) {
            this.enable = enable;
        }

    }

}

Определите соответствующий класс конфигурации

Функция аннотации @EnableConfigurationProperties — активировать классы, отмеченные аннотацией @ConfigurationProperties. Заметил это: раньшеCustomizePropertiesБез аннотации @Component его все равно можно внедрить в контейнер IOC. Не допускается в контейнере, когда он не действуетCustomizePropertiesкомпонент существует.

package com.springboot.autoconfigure.properties;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;

@Configuration
@EnableConfigurationProperties(CustomizeProperties.class)
public class CustomizeAutoConfiguration {

    private CustomizeProperties.Customize customize;

    /**
     * 构造注入,当有且仅有一个参数时,
     * 即使没有显式的@Autowired依然可以装配到目的Bean
     */
    public CustomizeAutoConfiguration(CustomizeProperties customizeProperties) {
        this.customize = customizeProperties.getCustomize();
    }

    /**
     * 将获取到的配置信息收集到List
     * 这里没有任何意义,只是为了方便打印
     */
    @Bean
    public ArrayList arrayList () {
        ArrayList<Object> list = new ArrayList<>();
        list.add(customize.getAddress());
        list.add(customize.getPort());
        list.add(customize.isEnable());
        return list;
    }

}

определить класс конфигурации

package com.springboot.autoconfigure.properties;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:application-dev.properties")
@ComponentScan("com.springboot.autoconfigure.properties")
public class Config {

}

определить класс запуска

package com.springboot.autoconfigure.properties;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.ArrayList;

public class MainCustomizeProperties {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(Config.class);
        ArrayList<Object> list = context.getBean(ArrayList.class);
        list.forEach(System.out::println);
    }

}

Если информация о конфигурации получена успешно, мы можем увидеть информацию о печати.

spring-configuration-metadata.json

Я полагаю, что многие люди впервые видят это имя файла.Метаданные Spring официально называет их метаданными и т. д. Spring-configuration-metadata.json — это файл json, определяющий метаданные. На самом деле, если вы будете внимательны, вы должны были найти подсказку: под информацией о конфигурации на первом изображении нет напоминания в виде волнистой линии. Это указывает на то, что разрешено связывание трех частей информации о конфигурации.
После того, как информация конфигурации связана с соответствующим Javabean, JavaBean также изменится. Метод сеттера, соответствующего свойству, имеет небольшой значок подсказки.

Информация о конфигурации подключена к JavaBean.За файлом Spring-Configuration-Metadata.json незаметно прошла красная линия. Конкретные правила настройки имеют подробное описание в упомянутых выше официальных документах.
Я опубликую информацию о моей конфигурации.

{
  "groups": [
    {
      "name": "spring",
      "type": "com.springboot.autoconfigure.properties.CustomizeProperties",
      "sourceType": "com.springboot.autoconfigure.properties.CustomizeProperties"
    },
    {
      "name": "spring.customize",
      "type": "com.springboot.autoconfigure.properties.CustomizeProperties$Customize",
      "sourceType": "com.springboot.autoconfigure.properties.CustomizeProperties",
      "sourceMethod": "getCustomize()"
    }
  ],
  "properties": [
    {
      "name": "spring.customize.address",
      "type": "java.lang.String",
      "sourceType": "com.springboot.autoconfigure.properties.CustomizeProperties$Customize"
    },
    {
      "name": "spring.customize.enable",
      "type": "java.lang.Boolean",
      "sourceType": "com.springboot.autoconfigure.properties.CustomizeProperties$Customize",
      "defaultValue": false
    },
    {
      "name": "spring.customize.port",
      "type": "java.lang.String",
      "sourceType": "com.springboot.autoconfigure.properties.CustomizeProperties$Customize"
    }
  ],
  "hints": []
}

На самом деле, если вы действительно не хотите его настраивать и добавлять зависимости, вы также можете сгенерировать его автоматически.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true </optional>
</dependency>