文章目錄
- 前言
- 一、properties和yml配置
-
- 1.1 IDEA 中Spring Boot的的配置檔案
- 1.2 配置檔案提示來源
- 二、Starter結構
-
- 2.1 Jar包結構
-
- 2.1.1 官方starter - Thymeleaf
-
- 2.1.1.1 starter
- 2.1.1.2 autoconfigure
- 2.1.2 非官方starter - Mybatis
-
- 2.1.2.1 starter
- 2.1.2.2 autoconfigure
- 2.2 配置和代碼實作(Mybatis為例)
-
- 2.2.1 依賴配置
- 2.2.2 properties或者yml約定配置
-
- 2.2.2.1 注解解釋
- 2.2.2.2 Mybatis約定資料注入
- 2.2.2.3 spring.factories檔案配置
- 2.2.2.4 配置類實作
- 2.2.2.5 效果
- 三、實作自己的starter
-
- 3.1 建立被starter自動配置的類
- 3.2 建立starter自動配置父工程
- 3.3 建立starter子工程
- 3.4 建立autoconfigure子工程
- 3.5 打包到本地庫 或者遠端庫
- 3.6 測試
- 總結
前言
上一章介紹了SpringBoot的四大元件:starter, autoconfigure, CLI 以及actuator。
本章我們就來揭開Spring Boot starter和autoconfigure的神秘面紗。Let’s go…
注意:
前兩章都提到過,Spring Boot的一大作用就是元件的
自動配置
(就是把相關Bean注入Spring 容器中)。
而自動配置的實作是基于我們今天說的starter來實作的,每個元件對應一個starter。
如果非要說直白一點,starter就是給實際的包畫了個妝
一、properties和yml配置
1.1 IDEA 中Spring Boot的的配置檔案

咦,IDEA中的配置檔案居然可以自動提示,它是怎麼做到的?難道是把Spring Boot的配置都緩存了一遍到自己的軟體中嘛?如果這樣的話那我們自己的配置怎麼提示?
草率了吧,我可以很明确的告訴你,
不是IDEA緩存的
,不是,不是。。。
下面我們看看他到底是哪裡來的?
1.2 配置檔案提示來源
看到這個圖是不是一下恍然大悟,沒錯,它就是去這個叫做autoconfigure的jar包中的
META-INFO/spring-configuration-metadata.json
檔案中擷取的。
先别管我們寫這麼一個json檔案會不會累死,我們先看看這個starter結構,我們寫一個starter會不會累死。
二、Starter結構
2.1 Jar包結構
一個完整的starter都會有兩個jar包:
starter
和
autoconfigure
。
starter
包無代碼,隻有相關依賴管理的pom檔案。
autoconfigure
包含Spring Boot需要的配置檔案(META-INFO)& 自動配置實作的Java代碼。
下面我們就看一個
官方的Thymeleaf starter - Thymeleaf
和 一個
非官方的mybatis starter - Mybatis
。
2.1.1 官方starter - Thymeleaf
2.1.1.1 starter
命名方式:
spring-boot-starter-xxx
那麼這麼問題就來了,這裡為啥沒有配置檔案呢?
這裡劃重點:因為這是Maven倉庫的包結構,可以在倉庫中看到POM檔案。
2.1.1.2 autoconfigure
命名方式:
spring-boot-xxx-autoconfigure
下面兩張圖假裝拼起來,因為太長了
這裡又有重點,劃好,要考:
這裡之是以沒有所謂的spring-boot-thymeleaf-autoconfigure是因為官方把一些基礎的配置都寫到了公共的配置spring-boot-autoconfigure包中
,不要問為什麼,問就是開發者樂意。
2.1.2 非官方starter - Mybatis
2.1.2.1 starter
命名方式:
xxx-spring-boot-starter
xxx在前頭,這是非官方的starter的命名格式
2.1.2.2 autoconfigure
命名方式:
xxx-spring-boot-autoconfigure
xxx在前頭,這是非官方的starter的命名格式
2.2 配置和代碼實作(Mybatis為例)
2.2.1 依賴配置
版本在父工程中定義了,我們自己使用中可以覆寫。
還有一個重要的依賴:
<!-- @ConfigurationProperties annotation processing (metadata for IDEs) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
這個依賴是在autoconfigure使用的,注釋寫的很明白,就是
解析@ConfigurationProperties注解描述的中繼資料資訊給IDE識别,即文章開始時候的json檔案。
注意:
官方的starter的版本資訊都在spring-boot-dependencies包中配置,可自行檢視
2.2.2 properties或者yml約定配置
2.2.2.1 注解解釋
該部分在下面碰到再回來看其用法和意義:
-
比對以xxx.xxxx開頭的properties或者yml約定到此類中。@ConfigurationProperties(prefix = "xxx.xxxx")
-
自動掃描所有starter中的spring.factories中配置的Configuration,并初始化其中的Bean執行個體。@EnableAutoConfiguration
-
聲明該類為配置類@Configuration
-
Conditional(條件),Class存在生效@ConditionalOnClass({ Xxx.class })
-
執行個體存在生效@ConditionalOnBean(Xxx.class)
-
開啟配置檔案中約定讀取的實體@EnableConfigurationProperties(XxxProperties.class)
-
在Xxx配置類初始化完成後初始化本類@AutoConfigureAfter(Xxx.class)
-
與@Configuration配合建立執行個體到Spring容器@Bean
-
該執行個體不存在生效@ConditionalOnMissingBean
2.2.2.2 Mybatis約定資料注入
Mybatis的約定接收實體類:
該類就是接收properties或者yml配置的約定。以上圖中的configLocation為例:
mybatis:
config-location: classpath:mapper/*.xml
注意:
- 命名比對為駝峰(Java) <——> 中劃線
如上例
- Object和List的配置方式參考:yaml文法
2.2.2.3 spring.factories檔案配置
注意:
- spring.factories是 k - v 結構;
- k是注解全限定名;
- v是注解掃描的包的全限定名.多個用逗号隔開
Spring Boot就是讀取這個檔案來知道該starter中需要初始化些什麼執行個體到Spring容器(具體的掃描邏輯後續在啟動邏輯中講)。
然後最重要的就是spring.factories中的EnableAutoConfiguration注解指定類的實作 -
實作需要配置執行個體的初始化
。
2.2.2.4 配置類實作
@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnBean(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
/**
* 使用yml檔案中約定。以MybatisProperties 接收,參考2.2.2.1
*/
private final MybatisProperties properties;
/**
* 建立SqlSessionFactory Bean執行個體
*/
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
....// 省略實作
}
//省略其他
...
}
2.2.2.5 效果
隻需要依賴mybatis starter并且配置資料源約定就可以直接使用SqlSessionFactory Bean執行個體。參考第一章的應用。
三、實作自己的starter
本章所有涉及到的代碼位址:Starter & 測試工程 & 第三方元件
3.1 建立被starter自動配置的類
這裡就不一步一步建立了,不會建立項目的參考第一章
pom檔案:
3.2 建立starter自動配置父工程
這裡就截圖了,代碼在文章結尾會有位址,自行下載下傳。
建立父工程就是建立一個工程把除了pom檔案全部删掉就行了。
POM檔案内容:
注意:上面的子工程在使用IDEA建立子工程的時候會自動配置。
3.3 建立starter子工程
建立方式(IDEA):
滑鼠右鍵父工程 -> new -> Module
搞定。
工程結構:
POM内容:
OK,事情已經完成了一大半!
3.4 建立autoconfigure子工程
工程結構:
POM内容:
什麼都不需要依賴
配置實體
/**
* 接收約定配置資訊的類
*/
@ConfigurationProperties("demo")
public class DemoProperties {
private boolean enable;
private String demoInfo;
}
配置自動配置類
實作自動配置類
@Configuration //聲明為配置類
@ConditionalOnClass(DemoService.class) //當類存在時候初始化該執行個體
@ConditionalOnProperty("demo.enable") //當約定配置存在初始化該執行個體
@EnableConfigurationProperties(DemoProperties.class) //開啟約定配置類
public class DemoAutoConfiguration {
@Autowired
private DemoProperties properties;
/**
* @Bean 初始化 DemoService 執行個體
* @return
*/
@Bean
public DemoService exec(){
return new DemoService(properties.getDemoInfo());
}
}
3.5 打包到本地庫 或者遠端庫
執行打包指令:
檢視包,上面介紹到的東西都有了:
3.6 測試
使用第一章的工程來測試:
- 添加依賴
- 添加配置
第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結 - 添加接口
- 請求
第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結
至此我們就實作了自己的starter用來自動配置第三方元件到系統中。
總結
本章所用到的所有代碼在這裡:Starter & 測試工程 & 第三方元件
本章主要介紹了Spring Boot的starter和autoconfigure,沒明白或者有問題的小夥伴可以留言。
下一章: Spring 是怎麼啟動的
,敬請期待。。。
上一章:Spring Boot四大核心元件