自定义spring-boot-starter

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 方法
 getCandidateConfigurations方法
读取需要获取的配置项名称
读取配置文件
配置文件路径

在换成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 定义

 getCandidateConfigurations方法load 方法

测试验证

在项目中引入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


版权声明:本文为weixin_37929489原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。