天天看點

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

文章目錄

  • 前言
  • 一、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的的配置檔案

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

咦,IDEA中的配置檔案居然可以自動提示,它是怎麼做到的?難道是把Spring Boot的配置都緩存了一遍到自己的軟體中嘛?如果這樣的話那我們自己的配置怎麼提示?

草率了吧,我可以很明确的告訴你,

不是IDEA緩存的

,不是,不是。。。

下面我們看看他到底是哪裡來的?

1.2 配置檔案提示來源

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

看到這個圖是不是一下恍然大悟,沒錯,它就是去這個叫做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

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

那麼這麼問題就來了,這裡為啥沒有配置檔案呢?

這裡劃重點:因為這是Maven倉庫的包結構,可以在倉庫中看到POM檔案。

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

2.1.1.2 autoconfigure

命名方式:

spring-boot-xxx-autoconfigure

下面兩張圖假裝拼起來,因為太長了

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結
第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

這裡又有重點,劃好,要考:

這裡之是以沒有所謂的spring-boot-thymeleaf-autoconfigure是因為官方把一些基礎的配置都寫到了公共的配置spring-boot-autoconfigure包中

,不要問為什麼,問就是開發者樂意。

2.1.2 非官方starter - Mybatis

2.1.2.1 starter

命名方式:

xxx-spring-boot-starter

xxx在前頭,這是非官方的starter的命名格式

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

2.1.2.2 autoconfigure

命名方式:

xxx-spring-boot-autoconfigure

xxx在前頭,這是非官方的starter的命名格式

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

2.2 配置和代碼實作(Mybatis為例)

2.2.1 依賴配置

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

版本在父工程中定義了,我們自己使用中可以覆寫。

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

還有一個重要的依賴:

<!-- @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 注解解釋

該部分在下面碰到再回來看其用法和意義:

  • @ConfigurationProperties(prefix = "xxx.xxxx")

    比對以xxx.xxxx開頭的properties或者yml約定到此類中。
  • @EnableAutoConfiguration

    自動掃描所有starter中的spring.factories中配置的Configuration,并初始化其中的Bean執行個體。
  • @Configuration

    聲明該類為配置類
  • @ConditionalOnClass({ Xxx.class })

    Conditional(條件),Class存在生效
  • @ConditionalOnBean(Xxx.class)

    執行個體存在生效
  • @EnableConfigurationProperties(XxxProperties.class)

    開啟配置檔案中約定讀取的實體
  • @AutoConfigureAfter(Xxx.class)

    在Xxx配置類初始化完成後初始化本類
  • @Bean

    與@Configuration配合建立執行個體到Spring容器
  • @ConditionalOnMissingBean

    該執行個體不存在生效

2.2.2.2 Mybatis約定資料注入

Mybatis的約定接收實體類:

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

該類就是接收properties或者yml配置的約定。以上圖中的configLocation為例:

mybatis:
  config-location: classpath:mapper/*.xml
           
第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結
注意:
  • 命名比對為駝峰(Java) <——> 中劃線

    如上例

  • Object和List的配置方式參考:yaml文法

2.2.2.3 spring.factories檔案配置

注意:
  • spring.factories是 k - v 結構;
  • k是注解全限定名;
  • v是注解掃描的包的全限定名.多個用逗号隔開

Spring Boot就是讀取這個檔案來知道該starter中需要初始化些什麼執行個體到Spring容器(具體的掃描邏輯後續在啟動邏輯中講)。

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

然後最重要的就是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自動配置的類

這裡就不一步一步建立了,不會建立項目的參考第一章

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

pom檔案:

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

3.2 建立starter自動配置父工程

這裡就截圖了,代碼在文章結尾會有位址,自行下載下傳。

建立父工程就是建立一個工程把除了pom檔案全部删掉就行了。

POM檔案内容:

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

注意:上面的子工程在使用IDEA建立子工程的時候會自動配置。

3.3 建立starter子工程

建立方式(IDEA):

滑鼠右鍵父工程 -> new -> Module

搞定。

工程結構:

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

POM内容:

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

OK,事情已經完成了一大半!

3.4 建立autoconfigure子工程

工程結構:

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

POM内容:

什麼都不需要依賴

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

配置實體

/**
 * 接收約定配置資訊的類
 */
@ConfigurationProperties("demo")
public class DemoProperties {
    private boolean enable;
    private String demoInfo;
}
           

配置自動配置類

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

實作自動配置類

@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 打包到本地庫 或者遠端庫

執行打包指令:

檢視包,上面介紹到的東西都有了:

第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

3.6 測試

使用第一章的工程來測試:

  • 添加依賴
第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結
  • 添加配置
    第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結
  • 添加接口
第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結
  • 請求
    第三章 實作自己的Spring Boot Starter前言一、properties和yml配置二、Starter結構三、實作自己的starter總結

至此我們就實作了自己的starter用來自動配置第三方元件到系統中。

總結

本章所用到的所有代碼在這裡:Starter & 測試工程 & 第三方元件

本章主要介紹了Spring Boot的starter和autoconfigure,沒明白或者有問題的小夥伴可以留言。

下一章: Spring 是怎麼啟動的

,敬請期待。。。

上一章:Spring Boot四大核心元件