maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
spring-boot-autoconfigure: 自定义 starter 必须的jar包,引入springboot的一些配置类
spring-boot-autoconfigure-processor: 打包的时候会在META-INF目录下生成 spring-configuration-metadata.json 文件,里边写入配置类属性的一些定义,在其他项目引入改jar包的时候,在 yaml 或者 properties 文件配置信息会有提示
ConfigurationProperties配置属性
自定义ConfigurationProperties,在里边定义当前starter需要引入的配置属性,最好带默认值
package org.example.myzdy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@EnableConfigurationProperties(MyConfigurationProperties.class)
@ConfigurationProperties(prefix = "my")
public class MyConfigurationProperties {
private boolean enable = false;
public boolean isEnable() {
return enable;
}
public MyConfigurationProperties setEnable(boolean enable) {
this.enable = enable;
return this;
}
}
添加了 spring-boot-autoconfigure-processor 依赖之后生成配置元数据定义文件 target/classes/META-INF/spring-configuration-metadata.json ,内容如下,如果需要查看各个属性,可以参考文档:https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html#appendix.configuration-metadata
{
"groups": [
{
"name": "my",
"type": "org.example.myzdy.MyConfigurationProperties",
"sourceType": "org.example.myzdy.MyConfigurationProperties"
}
],
"properties": [
{
"name": "my.enable",
"type": "java.lang.Boolean",
"sourceType": "org.example.myzdy.MyConfigurationProperties"
}
],
"hints": []
}
AutoConfiguration自动配置类
在配置类上边可以加 Conditional 的相关条件,启动时会根据条件判断配置是否生效 如果自定义starter的包路径在主项目
@ComponentScan 的扫描范围内,加 @Configuration 注解即可
如果不在扫描范围内,需要在META-INF下边配置,根据版本会有区别,后边会有示例
package org.example.myzdy;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@ConditionalOnProperty(value = "my.enable")
public class MyAutoConfiguration {
static {
System.out.println("MyAutoConfiguration init....");
}
@Bean
public MyConfigurationProperties myConfigurationProperties(){
return new MyConfigurationProperties();
}
}
添加自动注入扫描的配置类路径
如果配置文件路径在 @ComponentScan 的扫描范围内,加 @Configuration 即可,可以不用做下边的类路径配置
之前使用2.6.11版本时,需要在 resources/META-INF/spring.factories 文件中加入配置项org.springframework.boot.autoconfigure.EnableAutoConfiguration,springboot 在启动的时候会自动扫描并注入
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.example.myzdy.MyAutoConfiguration
对应源码链路:
@SpringBootApplication ->
@EnableAutoConfiguration ->
@Import({AutoConfigurationImportSelector.class}) ->
AutoConfigurationImportSelector 类的 getAutoConfigurationEntry 方法 ->
AutoConfigurationImportSelector 类的 getCandidateConfigurations方法 ->
SpringFactoriesLoader 类的 loadFactoryNames 方法
SpringFactoriesLoader 类的 loadSpringFactories 方法
在换成3.0.1版本时,发现配置地址做了修改,需要在 src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中加入需要注入的配置类全路径
org.example.myzdy.MyAutoConfiguration
对应源码链路:
@SpringBootApplication -> @EnableAutoConfiguration ->
@Import({AutoConfigurationImportSelector.class}) ->
AutoConfigurationImportSelector 类的 getAutoConfigurationEntry 方法 ->
AutoConfigurationImportSelector 类的 getCandidateConfigurations方法 ->
ImportCandidates 类的 load 方法中的 location 定义


测试验证
在项目中引入maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>myzdy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在 application.properties 加入配置,starter 引入 spring-boot-autoconfigure-processor 的情况下,配置会有提示,不引入不会提示,不影响项目正常启动运行
my.enable=true
启动之后正常打印日志,受配置类的 @ConditionalOnProperty(value = “my.enable”) 影响,如果不加上边配置或者配置为false,不会打印配置文件静态块的内容,即没有加载
参考官方文档地址: https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-auto-configuration.custom-starter



