Мне нечего делать, и когда я смотрю на исходный код, я нахожу, что практика 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>