springboot03:自定义AutoConfiguration
在看完自动装配的原理后,今天来div一个AutoConfiguration的过程,巩固一下学到的知识。
步骤
1.建立自定义starter的package
2.通过maven把自定义starter引入
3.通过ApplicationContext容器使用
建立自定义starter的package
通过空maven新建一个starter模块,编写pom.xml文件
<!-- 产出是jar包 -->
<packaging>jar</packaging>
<!-- name;description -->
<name>MySpringBootStarter</name>
<description>Starter</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
<!--target 和 source是必须要设定的,并且需要和java.version一致,否则会有编译错误-->
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<dependencies>
<!--如果需要一个有starter的项目,有三个jar包是必须要引入的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>2.7.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.7.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<version>2.7.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
建立三个类
xxxProperties 配置类
@ConfigurationProperties(prefix = "myservice")
public class MyServiceProperties {
// 如果application.yaml中没有配置,需要自动配置缺省值
private static final String MSG="aaaa";
private String msg = MSG;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
xxxAutoConfiguration 自动装配类
@Configuration
@EnableConfigurationProperties({MyServiceProperties.class})
@ConditionalOnClass({MyService.class})
@ConditionalOnProperty(prefix = "myservice", value = "msg", matchIfMissing = true)
public class MyServiceAutoConfiguration {
// 自动注入MyServiceProperties
@Autowired
private MyServiceProperties myServiceProperties;
// 初始化MyService,并且放入容器
@Bean
@ConditionalOnClass(MyService.class)
public MyService myService(){
MyService myService = new MyService();
// 从Properties文件中注入msg
myService.setMsg(myServiceProperties.getMsg());
return myService;
}
}
xxx service类
public class MyService {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String doSomething(){
return "Hello! " + this.msg;
}
}
在resources文件夹下新建一个META-INF文件夹,新建spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.silvercorridors.MyServiceAutoConfiguration
打包(package)
安装到本地仓库(install)
到这里,一个自动装配的架子就初步搭好了
在springboot中实现自动装配
在springboot项目中pom.xml引入刚才创建的自定义starter
<dependency>
<groupId>cn.silvercorridors</groupId>
<artifactId>MySpringBootStarter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
yaml配置文件添加配置信息(不设定则为默认值:aaaa)
Myservice:
msg: abcd
在Controller中调用
@Controller
public class MyController {
@Autowired
private MyService myService;
@RequestMapping("/r1")
@ResponseBody
public String r1(){
return myService.doSomething();
}
}
运行结果:实现自动配置

查询自动装配初始化信息
如果我们想要知道,AutoConfiguration在初始化时自动装配了哪些属性,可以通过如下操作来查看。
配置文件中
debugger: true
此时,再一次运行springboot启动类,会多出如下debug信息:

告诉了哪些AutoConfiguration被match了,告诉了被match的原因并且进行相应的操作
还有一些AutoConfiguration没有被match,告诉了没有被match的原因

这里我们可以看到MyServiceAutoConfiguration与其中的myService成员在启动时被匹配到了,因为满足了存在MyService.class的条件

这里的条件对应的就是MyServiceAutoConfiguration中的 @ConditionalOnClass(MyService.class)。