對於springboot個人認為它就是整合了各種組件,然后提供對應的自動裝配和啟動器(starter),基於這個流程去實現一個定義的裝配組件
還是這張圖
一、創建自己的自動配置工程, spring.factories文件中配置上自己的配置
1.創建一個Properties類(UserDefProperties)用於接收配置文件配置的參數,類似於RabbitMQ/Mybatis等在yaml中配置的參數(對標該類org.springframework.boot.autoconfigure.amqp.RabbitProperties),
package com.nijunyang.autoconfig.properties; import org.springframework.boot.context.properties.ConfigurationProperties; /** * * 自定義的配置類,映射配置文件參數 * @author: create by nijunyang * @date:2019/7/15 */ @ConfigurationProperties(prefix = "spring.userdef.model") public class UserDefProperties { private String userName; private Integer age; private Double height; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Double getHeight() { return height; } public void setHeight(Double height) { this.height = height; } }
2.創建一個XXXAutoConfiguration類(UserDefAutoConfiguration),實現我們的裝配邏輯也就是從配置文件中獲取數據並初始化我們需要的數據,比如RabbitMQ/Mybatis初始化各種連接工廠(org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.RabbitConnectionFactoryCreator#rabbitConnectionFactory),我們這兒就獲取配置數據轉換成一個對象用於測試效果,
package com.nijunyang.autoconfig.config; import com.nijunyang.autoconfig.model.User; import com.nijunyang.autoconfig.properties.UserDefProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; /** * 自定義啟動類配置類 * @author: create by nijunyang * @date:2019/7/15 */ @Slf4j @EnableConfigurationProperties(value = UserDefProperties.class) public class UserDefAutoConfiguration { @Autowired private UserDefProperties userDefProperties; @Bean public User user(){ log.info("自定義自動裝配UserDefAutoConfiguration....."); User user = new User(); user.setAge(userDefProperties.getAge()); user.setUserName(userDefProperties.getUserName()); user.setHeight(userDefProperties.getHeight()); return user; } }
3. spring.factories文件中配置EnableAutoConfiguration數據指向我們自己的UserDefAutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.nijunyang.autoconfig.config.UserDefAutoConfiguration
二、創建自己的啟動器(starter)
1.啟動器啥都不需要做,只需要引入自動配置工程依賴
<dependency> <groupId>com.nijunyang</groupId> <artifactId>autoconfig</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
三、測試工程
1. 引入啟動器依賴
<dependency> <groupId>com.nijunyang</groupId> <artifactId>starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
2. application.properties配置中加入自動配置工程中Properties類對應的值,類似我們在application.properties配置mybatis連接一樣
spring.userdef.model.userName=zhangsan
spring.userdef.model.age=18
spring.userdef.model.height=1.70
3.測試接口類,自動注入我們用我們用於測試的建模
package com.nijunyang.autoconfigurationstartertest.controller; import com.nijunyang.autoconfig.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author: create by nijunyang * @date:2019/7/15 */ @RestController public class Controller { @Autowired User user; @GetMapping("/test") public User getUser() { return user; } // @GetMapping("/test") // public String getUser() // { // return "123"; // } }
4.啟動工程查看日志,發現我們自定義的裝配類日志會在啟動日志輸出,說明啟動過程中去自動裝配了自己的組件
5.測試接口訪問,返回配置文件中的數據
四、斷點查看selectImports方法引入自定義啟動和不引入對比,org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports
引入:
不引入:
至此就簡單實現了一個自定義的自動裝備組件...