Spring?boot?自定義?Starter及自動配置的方法
Starter 組件簡介
Starter 組件是 Spring boot 的一個核心特性,Starter組件的出現(xiàn)極大的簡化了項目開發(fā),例如在項目中使用的pom.xml文件中添加以下配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.3</version>
</dependency>Spring boot 就會自動關聯(lián)web 開發(fā)相關的依賴,如 tomcat 及 spring-mvc等,進而能支持web開發(fā),同時相關技術也將實現(xiàn)自動配置,避免了繁瑣的配置文件。
Starter 組件 使開發(fā)者不需要關注各種依賴庫的處理、不需要具體的配置信息,由Spring boot 自動完成class的發(fā)現(xiàn)并加載。
利用Starter實現(xiàn)自動化配置需要兩個條件:Maven依賴以及配置文件。
Maven依賴實際上就是導入一個JAR,然后Springboot啟動時候就會找到這個jar包中 resource/META-INF/spring.factories文件,根據(jù)文件的配置找到相關的實現(xiàn)類。以上就是spring boot 的自動裝配機制,如果理解該機制的話,很容易就能手寫一個 starter 組件。
對starter組件我們可以簡單理解為:
- 每個不同的starter組件實際上完成自身的功能邏輯,然后對外提供一個bean對象讓別人調用
- 對外提供的bean通過自動裝配機制注入到IOC容器中
自定義 Starter 組件
要實現(xiàn)一個自己的 starter 組件其實也很簡單,首先我們需要明確我們需要做那些事:
- 通過配置類提供對外服務的 bean 對象
- 按照自動裝配原理完成 spring.factories 的編寫
- starter 自動屬性配置
Starter 組件
接下來我們就手寫一個 starter 組件,模仿 RedisTemplate,流程如下:
- 創(chuàng)建一個spring boot 項目
redis-starter-demo - 創(chuàng)建
MyStarterTemplate
簡單模擬 redis 的 get,set操作:
public class MyStarterTemplate {
Map<String, String> map = new HashMap<>();
public String put(String key, String value) {
map.put(key, value);
return "保存成功";
}
public String get(String key) {
return map.get(key);
}
}- 創(chuàng)建配置類
@Configuration
public class MyAutoConfiguration {
@Bean
public MyStarterTemplate myStarterTemplate(){
return new MyStarterTemplate();
}
}- 實現(xiàn)自動裝配流程
在 classpath 下 META-INF目錄下創(chuàng)建 spring.factories 文件:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.redisstarterdemo.MyAutoConfiguration
打包發(fā)布 maven install
使用 Starter
- 創(chuàng)建一個新項目用來引入 starter
test-demo - pom 文件引入依賴
<dependency>
<groupId>com.example</groupId>
<artifactId>redis-starter-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>編寫接口 ,直接 Autowired 注入MyStarterTemplate
@RestController
@RequestMapping(value = "/myRedis")
public class RedisStarterController {
@Autowired
private MyStarterTemplate myStarterTemplate;
@RequestMapping("/save")
public String save(@RequestParam String key, @RequestParam String value) {
myStarterTemplate.put(key,value);
return "ok";
}
@RequestMapping("/get")
public String get(@RequestParam String key) {
return myStarterTemplate.get(key);
}
}以上便是一個完成的自定義 Starter,如果搞懂SPI機制的話,現(xiàn)在應該覺得很簡單單了吧?
Starter 傳參
以上是一個最簡單的 starter 組件,但是有這么一種情況,我們還以 redis 為例,在 redis 中我們是可以通過在配置文件中來設置地址、賬號密碼等信息的,那這種情況我們應該如何操作呢?
- 我們還是在上面的項目中繼續(xù)添加代碼
- 創(chuàng)建需要注入的 bean 類
這里我們通過對外暴露一個創(chuàng)建方法用來給對象傳遞地址和端口號;
public class MyRedis {
public String say() {
return "my host:" + host + ",port:" + port;
}
public static MyRedis create(String host, Integer port) {
return new MyRedis(host, port);
}
public MyRedis(String host, Integer port) {
this.host = host;
this.port = port;
}
private String host;
private Integer port;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
}
- 創(chuàng)建屬性類
@ConfigurationProperties(prefix = "redis")的作用是讀取 application中以 redis 開頭的數(shù)據(jù),還有其他幾種讀取配置文件的注解可以自行研究。
由于我們這里設置了默認值,所以如果不配置的話也不影響,會使用默認值傳遞給 bean 。
@ConfigurationProperties(prefix = "redis")
public class MyProperties {
private String host = "127.0.0.1";
private Integer port = 6379;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
}
@ConfigurationProperties(prefix = "redis")
public class MyProperties {
private String host = "127.0.0.1";
private Integer port = 6379;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
}
- 創(chuàng)建配置類
使用配置文件,將相關信息傳遞給 bean 類。
@Configuration
@EnableConfigurationProperties(MyProperties.class)
public class MyRedisConfiguration {
@Bean
public MyRedis myRedis(MyProperties properties) {
return MyRedis.create(properties.getHost(), properties.getPort());
}
}- 實現(xiàn)自動裝配流程
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.redisstarterdemo.demo1.MyAutoConfiguration,\ com.example.redisstarterdemo.demo2.MyRedisConfiguration
在項目中引用還是同樣的操作,如果想要設置屬性的話,只需要在配置文件中編寫相關信息即可:
redis.host=196.128.255.255 redis.port=9999
自身與第三方維護
針對 spring boot 的starter 組件分為兩類:
1.springboot 自身維護的starter組件
- 所有的 starter 組件自身不帶 spring.factories 文件,都集中在spring-boot-autoconfigure 包下的 EnableAutoConfiguration
- springboot 裝配這些配置類是由條件的,不會將所有的都一股腦都加載進來,假設我沒用到 redis 的話就不會引入相關依賴包,這樣根據(jù)@ConditionalOnClass(RedisOperations.class)在classpath下找不到RedisOperations類,就不會加載該配置類。
- 自身維護的starter組件的命名為:spring-boot-starter-xxx
2.第三方維護的starter 組件
- 在自己的 jar 中維護 spring.factories 文件
- 命名方式:xxx-spring-boot-starter
到此這篇關于Spring boot 自定義 Starter 及 自動配置的文章就介紹到這了,更多相關Spring boot 自定義 Starter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用hibernate和struts2實現(xiàn)分頁功能的示例
本篇文章主要介紹了使用hibernate和struts2實現(xiàn)分頁功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
spring-boot整合Micrometer+Prometheus的詳細過程
這篇文章主要介紹了springboot整合Micrometer+Prometheus的詳細過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-05-05
IDEA工程運行時總是報xx程序包不存在實際上包已導入(問題分析及解決方案)
這篇文章主要介紹了IDEA工程運行時,總是報xx程序包不存在,實際上包已導入,本文給大家分享問題分析及解決方案,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2020-08-08
Java Swing中JList選擇事件監(jiān)聽器ListSelectionListener用法示例
這篇文章主要介紹了Java Swing中JList選擇事件監(jiān)聽器ListSelectionListener用法,結合具體實例形式分析了中JList選擇事件監(jiān)聽器ListSelectionListener的功能、使用方法及相關注意事項,需要的朋友可以參考下2017-11-11
spring boot搭建文件服務器解決同時上傳多個圖片和下載的問題
這篇文章主要介紹了spring boot搭建文件服務器解決同時上傳多個圖片和下載的問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11

