自定義spring boot starter三部曲之一:準備工作
從本章開始,一起實戰一個自定義的spring boot starter,整個系列共三篇文章,內容如下:
- 準備:瞭解基本概念、規劃實戰內容;
- 實戰:開發自定義starter,並在demo工程中使用它;
- 深入:從spring和spring boot原始碼層面分析starter的原理;
三部曲文章連結
- 《自定義spring boot starter三部曲之一:準備工作》;
- 《自定義spring boot starter三部曲之二:實戰開發》;
- 《自定義spring boot starter三部曲之三:原始碼分析spring.factories載入過程》
本章內容概覽
- 檢視官方資料;
- 設定實戰目標;
- 學習spring cloud的starter,作為實戰參考;
- 實戰內容的具體設計;
版本資訊
本次實戰的版本資訊:
- java:1.8.0_144
- spring boot:1.5.16.RELEASE
- spring cloud:Edgware.RELEASE
官方資料
為了有個初始印象,我們從spring官方文件看起吧:
-
在彈出的列表中選擇1.5.16版本的reference,如下圖紅框:
-
在開啟的文件目錄中很容易找到starter的章節,地址是:https://docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/htmlsingle/#using-boot-starter,內容如下圖:
我的理解:
第一. 在應用中可以用starter將依賴庫問題變得簡單,如果你想依賴Spring和JPA,只需在應用中依賴spring-boot-starter-data-jpa即可;
第二. 常用庫的官方starter,其artifactId的格式類似"spring-boot-starter-*", 對於非官方的starter,建議將業務名稱放在"spring-boot-starter"前面,例如"acme-spring-boot-starter";
第三. 已列舉常用的官方starter,可用來參考;
設定實戰目標
本次實戰的目標如下:
- A應用提供加法計算的服務;
- B應用提供減法計算的服務;
- C應用要使用加法計算和減法計算的服務,並且減法服務可以通過配置來實現是否支援負數;
學習spring cloud的starter
目標已定下,但是先不急著編碼,我們去看下spring cloud的設計,用來作為借鑑參考;
回顧一下我們使用Spring cloud的時候,如果要把一個應用作為Eureka client註冊到Eureka server,只需在應用的pom.xml中新增如下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
註冊到Eureka server的工作,是由CloudEurekaClient類完成的,該類屬於模組spring-cloud-netflix-eureka-client,因此我們要弄清楚以下兩點:
- 為什麼不需要應用的pom.xml中依賴spring-cloud-netflix-eureka-client?
- 為什麼應用能自動註冊到Eureka sever?
如何建立對spring-cloud-netflix-eureka-client模組的依賴
開啟spring-cloud-starter-netflix-eureka-client模組的pom.xml檔案就一目瞭然了,如下圖,原來在這個pom.xml檔案中已經依賴了spring-cloud-netflix-eureka-client模組,因此,我們的應用只需依賴spring-cloud-starter-netflix-eureka-client模組,就能間接依賴到spring-cloud-netflix-eureka-client模組:
再看看上圖中其他的依賴,可以發現的確如官方文件所說,starter處理了複雜的依賴關係,我們只需要依賴starter即可,官方文件中還有一段話需要注意,如下圖:
上圖紅框中說明starter是個空的jar,其作用就是用來提供必要的模組依賴的,來看看spring-cloud-starter-netflix-eureka-client模組是否遵守此規則,如下圖,只有配置檔案,沒有任何class:
為什麼應用能自動註冊到Eureka sever
作為Eureka client的應用,在啟動後就自動註冊到Eureka server了,作為應用開發者的我們除了在pom.xml中依賴spring-cloud-starter-netflix-eureka-client模組,沒有做其他設定,這是如何實現的呢?
- 註冊到Eureka server的工作,是CloudEurekaClient類在其父類的構造方法中完成的,搜尋原始碼發現此類的在EurekaClientAutoConfiguration中被註冊到spring容器,如下圖紅框所示:
所以,現在問題就變成了如何讓EurekaClientAutoConfiguration類被例項化?
- 在spring-cloud-netflix-eureka-client模組的spring.factories檔案中,找到了EurekaClientAutoConfiguration:
這是個spring boot的擴充套件配置,在此檔案中配置的bean都會被例項化,然後註冊到spring容器,具體的細節,我們會在第三章結合spring boot原始碼詳細分析,本章只要知道用法即可;
此處小結Eureka client自動註冊到Eureka server的過程:
第一、spring-cloud-netflix-eureka-client模組的spring.factories檔案中配置了EurekaClientAutoConfiguration,因此EurekaClientAutoConfiguration會被例項化並註冊到Spring容器中;
第二、EurekaClientAutoConfiguration中配置了CloudEurekaClient,因此CloudEurekaClient會例項化,在構造方法中執行了註冊;
實戰的設計
參考了spring cloud的starter設計後,接下來的實戰被設計成兩個maven工程:customizestarter和customizestartertestdemo;
- 工程customizestarter裡面包含了四個模組,每個模組功能如下所示:
模組名稱 | 作用 | 備註 |
---|---|---|
customizeapi | 包含 了介面和異常的定義 | 實現和呼叫服務時用到的介面和異常都在此工程中 |
addservice | 提供加法服務 | 普通的maven工程,裡面加法介面的實現類 |
minusservice | 提供減法服務 | 普通的maven工程,裡面有兩個減法介面的實現類,一個支援負數,另一個不支援 |
customizeservicestarter | 自定義starter模組 | pom.xml中依賴了customizeapi、addservice、minusservice,自身有個Configuration類,通過@Bean註解向spring容器註冊AddService和MinusService的例項 |
- 工程customizestartertestdemo在pom.xml中依賴了上述的customizeservicestarter模組,提供的web服務會用到addservice和minusservice的服務,並且在應用啟動時設定環境變數來選擇使用的減法服務是否支援負數;
至此,準備工作已經完成了,對基本原理和開發設計都已經清楚,接下來的章節我們來一起開發上述五個工程;