自定义一个空的Maven项目
项目结构

依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hrui</groupId>
<artifactId>hrui-sms-spring-boot-starter</artifactId>
<version>1.0.0</version>
<properties>
//UTF8设置 为了打包时候编码不冲突
<java.version>17</java.version>
<spring-boot.version>3.5.4</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencies>
<!-- 提供 @AutoConfiguration、@ConditionalOnMissingBean 等注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- 可选:让 application.yml 有配置提示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring-boot.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
三个类
package com.hrui.sms.starter;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
@AutoConfiguration
@EnableConfigurationProperties(SmsProperties.class)
public class SmsAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public SmsClient smsClient(SmsProperties properties) {
return new SmsClient(properties);
}
}
package com.hrui.sms.starter;
public class SmsClient {
private final SmsProperties properties;
public SmsClient(SmsProperties properties) {
this.properties = properties;
}
public void send(String phone, String content) {
System.out.println("短信供应商:" + properties.getProvider());
System.out.println("发送短信:" + phone + " -> " + content);
}
}
package com.hrui.sms.starter;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "hrui.sms")
public class SmsProperties {
/**
* 短信供应商
*/
private String provider = "default";
/**
* accessKey
*/
private String accessKey;
/**
* secretKey
*/
private String secretKey;
public String getProvider() {
return provider;
}
public void setProvider(String provider) {
this.provider = provider;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
}
application.yml
resources下创建 META-INF 再创建spring包
创建
org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
内部写入
com.hrui.sms.starter.SmsAutoConfiguration

mvn clean install 打包
在其他SpringBoot中引入

就可以自动装配了

Spring Boot 项目启动时,会从 整个 classpath 里找所有 jar 包中的这个文件,然后把里面的自动配置类都读出来。Spring Boot 官方文档也说明,发布的 jar 中可以通过这个 AutoConfiguration.imports 文件声明 auto-configuration class,每行一个类名
spring-boot-autoconfigure.jar
└── META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
├── DataSourceAutoConfiguration
├── RedisAutoConfiguration
└── ...
你的 hrui-sms-spring-boot-starter.jar
└── META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
└── com.hrui.sms.starter.SmsAutoConfiguration
读取 Spring Boot 自己的 AutoConfiguration.imports
读取你 starter 里的 AutoConfiguration.imports
读取其他 starter 里的 AutoConfiguration.imports
=
最终自动配置类列表