定义
什么是自动装配?
SpringBoot 在启动时会扫描外部依赖jar 包中的某些文件,将文件中配置的类型信息加载到 Spring 容器。
简单来说,自动装配能够加载三方jar包中的类,注册到Spring容器。
自动装配版本
自SpringBoot 2.7版本开始,对于如何告知SpringBoot要自动装配哪些类发生了变化。
在这之前的SpringBoot版本,需要写一个spring.factories,放到recourses下的META-INF目录。
而从2.7版本开始,需要写一个org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,放在放到recourses/META-INF/spring目录下,如图所示:
如果自定义starter
说明
首先要清楚:封装成starter意味着需要自动装配某些类,否则它就是一个普通的maven项目,不需要做成starter。
- 创建两个模块,starter模块和autoconfig模块。starter模块会引用autoconfig模块,也可以管理一些依赖,并不需要编码。(包一层思想)
- 创建一个模块,starter模块和autoconfig模块融合在一起。
第一个种方式的好处是:解耦,如果自动装配项目有好几个,有一些可选的特性(也只是针对这种类似情况),
通过starter将autoconfig包装,就可以在starter中对依赖进行管理:排除或者依赖传递。将starter模块暴露给用户,引入即可用,更加便捷。
编码
我这里采用分两个模块开发starter,一共创建了三个项目:
- springboot-starter-demo-autoconfig - starter的配置逻辑实现项目
- springboot-starter-demo - 1的封装项目
- starter-use-demo - 使用starter的项目
项目一:springboot-starter-demo-autoconfig
项目结构
POM依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<autoconfigure.version>2.7.6</autoconfigure.version>
<autoconfigure.processor.version>2.7.6</autoconfigure.processor.version>
</properties>
<!-- 自动配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${autoconfigure.version}</version>
<optional>true</optional>
</dependency>
<!-- 配置处理,增加配置提示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<version>${autoconfigure.processor.version}</version>
<optional>true</optional>
</dependency>
注意:这里一般需要将自动配置的optional 设置为true 即不产生传递依赖,避免引用的项目依赖冲突
代码
@AutoConfiguration
@ConfigurationProperties(prefix = "test")
public class TestConfig {
private String name;
private String hobby;
public TestConfig() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
文件1:即为实现SpringBoot自动装配的配置文件:com.xy.example.TestConfig
文件2:实现配置提示的元数据文件,文件2的内容即效果如下:
{
"properties": [
{
"name": "test.name",
"type": "java.lang.String",
"description": "姓名"
},
{
"name": "test.hobby",
"type": "java.lang.String",
"description": "爱好"
}
]
}
项目二:springboot-starter-demo
pom文件
引入项目一的依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.xy</groupId>
<artifactId>springboot-starter-demo-autoconfig</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
项目三:starter-use-demo
pom文件 引入项目二的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.xy</groupId>
<artifactId>springboot-starter-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
applicition.properties配置文件:
测试类
@SpringBootTest
class StarterUseDemoApplicationTests {
@Autowired
private TestConfig config;
@Test
void contextLoads() {
System.out.println(config.getName() + "-" + config.getHobby());
}
}
打印结果
一个自定义的starter就完成了~