大家好,今天的技术贴主题
手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理
Spring Boot中的启动器是如何启动的,很多人都对这个问题搞不清楚。今天峰哥带着大家通过自定义一个启动器,可以很容易的看懂Spring Boot是怎么样自动配置的。下面我们通过一个案例来说明这个问题。
步骤如下
01步骤
新建一个普通的Maven项目,关键部分截图如下。
02步骤
在工程的pom.xml文件中添加Spring boot自动化配置依赖,其他的部分无需修改。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
</dependencies>
03步骤
配置完成后,首先创建HelloProperties 类,用来接受 application.properties 中注入的值,如下
package com.java;
@ConfigurationProperties(prefix = "author")
public class HelloProperties {
private static String DEFAULT_NAME="罗贯中";
private static Integer DEFAULT_AGE=34;
private String name=DEFAULT_NAME;
private Integer age=DEFAULT_AGE;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
该配置类很好理解,我们在后面新建一个工程,可以根据需要,通过application.properties将我们自已配置的属性值注入到name和age中。如果没有注入就会使用默认的值“罗贯中”和34,让属性值为这两个。类上的注解我们前面学过,应该也不陌生。
04步骤
创建service包,创建业务类HelloService.功能非常简单,就是一个输出name和age的功能。编码如下:
package com.java.service;
public class HelloService {
private String name;
private Integer age;
public String sayHello(){
return name+"的年龄是:"+age;
}
//getter和setter省略...
}
05步骤
编写自动配置类HelloServiceAutoConfiguration,先写代码。然后后面进行解释说明。
package com.java.configuration;
import com.java.HelloProperties;
import com.java.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {
@Autowired
private HelloProperties helloProperties;
@Bean
HelloService helloService(){
HelloService helloService=new HelloService();
helloService.setName(helloProperties.getName());
helloService.setAge(helloProperties.getAge());
return helloService;
}
}
对自动配置类的注解进行解释说明:
- @Configuration表明这是一个配置配。
- @EnableConfigurationProperties(HelloProperties.class)表示自动配置属性类,让HelloProperties类的属性进入Spring的Bean中。
- @ConditionalOnClass(HelloService.class):这个注解是Conditional注解的子注解,意思是表示当项目当前 classpath 下存在如果HelloService类存在,后面的配置才生效,这个原理就是我们前面讲解的条件注解,大家可以回忆一下条件注解的用法。
06步骤
创建资源文件夹,在resources文件夹下面创建META-INF文件夹,创建spring.factories文件。其实这个可以随便参考一个启动器,就能很清楚的知道。
07步骤
打包到本地仓库供我们使用,在第一个工程chapter01中添加如下依赖,并在HelloController中添加测试方法。代码如下:
修改application.yml,然后对author进行属性配置。再次进行测试,最后结果如下:
application.yml
spring:
profiles:
active: dev
---
server:
port: 8083
author:
name: 老大
age: 56
pom.xml添加依赖
<dependency>
<groupId>com.java</groupId>
<artifactId>HelloWorldStarter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
HelloController类添加如下代码
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@GetMapping("/test")
public String test(){
return helloService.sayHello();
}
}