隨着Spring的日漸臃腫,爲了簡化配置、開箱即用、快速集成,Spring Boot 橫空出世。 目前已經成爲 Java 目前最火熱的框架了。日常咱們用Spring Boot開發web應用。Spring mvc 默認使用tomcat servlet容器, 由於Spring mvc組件集成了spring-boot-starter-tomcat 。可是如今undertow servlet容器的性能很是好。咱們能夠經過如下方式先排除tomcat:
java
而後直接替換爲undertow:web
代碼無需更改。這就是組件化後的好處:1.可插拔。2.可定製。3.按需集成。爲何可以作到快速適配?咱們試想一個這樣一個場景:假如你的汽車輪子上有個螺絲壞了,你要買一個螺絲去本身裝。你去店裏只要報上你汽車的品牌和位置老闆就能準確地知道你要用哪一種螺絲。這就是標準已經制定好的好處。若是沒有標準,你很容易買到不配套的螺絲,你要不停的試錯。這顯然不是你想要的。 若是把這種標準潛移默化,那麼咱們在溝通上就更加快捷方便。有時候你女友一個眼神你就知道她想要幹什麼。因此Spring Boot 有一個「約定大於配置」的規則,讓程序組件之間來減小配置,下降複雜性。所以你在開發一個自定義的Spring Boot Starter的時候也最好考慮你的starter如何達到以上的便利性。redis
一個組件的設計必定要有標準和規則。Spring Boot Starter也不例外。咱們來看看一些常規的作法。spring
若是你快有孩子了,出生前你比較急的必定是起個名字。姓名標識着你和你愛人的血統,必定不會起隔壁老王的姓氏,確定會招來異樣的眼光。在maven中,groupId表明着姓氏,artifactId表明着名字。Spring Boot也是有一個命名的建議的。groupId不要用官方的org.springframework.boot
而要用你本身獨特的。對於artifactId的命名,Spring Boot官方建議非官方的Starter命名格式遵循 xxxx-spring-boot-starter ,例如 mybatis-spring-boot-starter 。官方starter會遵循spring-boot-starter-xxxx ,例如上面提到的spring-boot-starter-undertow 。不少開源starter做者會忽略這種約定,顯得不夠「專業「。json
接下來咱們構建一個自定義的第三方短信starter,命名爲sms-spring-boot-starter 。有一些細節問題須要邊寫邊來介紹。下面是一個省略了samples和test模塊模版:segmentfault
依據上面咱們創建以下項目:tomcat
sms-spring-boot構建一個項目重要的就是依賴管理。因此引入BOM是必要的。主要管理該starter的全部模塊module,以及starter的全部依賴甚至sms-spring-boot-autoconfigure都由sms-spring-boot管理。mybatis
該模塊主要用來定義配置參數、以及自動配置對外暴露的功能(通常是抽象的接口Spring Bean)。mvc
通常配置參數都是在Spring Boot 的application.yml中。咱們會定義一個前綴標識來做爲名稱空間隔離各個組件的參數。對應的組件會定義一個XXXXProperties 來自動裝配這些參數。自動裝配的機制基於@ConfigurationProperties註解,請注意必定要顯式聲明你配置的前綴標識(prefix)。咱們的sms-spring-boot會做以下配置:app
以上以阿里雲的短信功能爲例做配置,在未來使用時只須要在application.yml中加入上面對應SmsProperties的配置:
若是你集成了Spring Boot 校驗庫 你也能夠對SmsProperties進行校驗。在配置application.yml時細心的java開發者會發現參數配置都有像下面同樣的參數描述:
就像java中的註釋同樣方便咱們理解該配置的做用,其實這個就是java註釋生成的。你須要依賴
而後就該依賴會對SmsProperties 成員屬性的註釋進行提取生成一個spring-configuration-metadata.json文件,這就是配置描述的元數據文件。Spring Boot官方也對註釋進行了一些規則約束:
補充我我的建議描述儘可能使用英文描述。
拿到配置後,接下來就是根據配置來初始化咱們的功能接口,咱們會抽象一個短信發送接口SmsSender,根據短信提供方的SDK來進行功能設計。請注意autoconfigure模塊的依賴幾乎都是不可傳遞的。也就是依賴座標配置optional爲true 。
功能接口實現完後咱們會編寫一個自動配置類 SmsAutoConfiguration 。除了@Configuration註解外,@ConfigurationProperties會幫助咱們將咱們的配置類SmsProperties加載進來。而後將咱們須要暴露的功能接口聲明爲Spring Bean 暴露給Spring Boot應用 。有時候咱們還能夠經過一些條件來控制SmsAutoConfiguration或者SmsSender ,好比根據某個條件是否加載或加載不一樣的SmsSender。有時間你能夠看看redis-starter就能很明顯感受到,它會根據luttuce、redisson、jedis 的變化實例化不一樣的客戶端連接。實現方式是使用了@Conditional系列註解,有時間能夠學習一下該系列的註解。好了咱們的SmsAutoConfiguration聲明以下:
starter集成入應用有兩種方式。咱們從應用視角來看有兩種:
咱們將該註解標記入Spring Boot應用就可使用短信功能了。
多個配置類逗號隔開,換行使用反斜槓。
該模塊是一個空jar。它惟一目的是提供必要的依賴項來使用starter。你能夠認爲它就是集成該starter功能的惟一入口。不要對添加啓動器的項目作出假設。若是您自動配置的依賴庫一般須要其餘啓動器,請同時說起它們。若是可選依賴項的數量很高,則提供一組適當的默認依賴項可能很難,由於您應該避免包含對典型庫的使用沒必要要的依賴項。換句話說,您不該該包含可選的依賴項。
不管哪一種方式,您的starter必須直接或間接引用核心Spring Boot啓動器(spring-boot-starter)(若是您的啓動器依賴於另外一個啓動器,則無需添加它)。若是隻使用自定義啓動器建立項目,則Spring Boot的核心功能將經過核心啓動器的存在來實現。
咱們的sms-spring-boot-starter僅僅是如下的pom:
到此爲止,咱們的整個短信Starter就開發完成了。
自定義starter對於咱們項目組件化、模塊化是有很大幫助的。同時也是Spring Boot一大特點。相信經過小胖的介紹你已經蠢蠢欲試了,那麼就趕忙開始寫一個吧。若是以爲對你有用能夠點個贊關注一下。
關注公衆號:碼農小胖哥 獲取更多資訊