三分鐘實(shí)戰(zhàn)手寫Spring Boot Starter
1 背景#
在平時的開發(fā)中,開發(fā)的同學(xué)會把一些通用的方法,寫成一個工具類,例如日期轉(zhuǎn)換的,JSON轉(zhuǎn)換的等等,方便業(yè)務(wù)后續(xù)調(diào)用,使代碼更容易維護(hù)。
如果一些更常用的方法,例如鑒權(quán)的,加解密的等等,幾乎每個項(xiàng)目都會使用到,這時候開發(fā)的同學(xué)就會從以前的項(xiàng)目中再抄過來,隨著項(xiàng)目的增多,幾乎每個項(xiàng)目都有一份一模一樣的工具類。經(jīng)過技術(shù)評審決定,將這些工具類打包成jar
包,后續(xù)的新項(xiàng)目可以直接以jar
包的形式引入,重用就會變得非常的好。
由于項(xiàng)目本身是基于Spring Boot
進(jìn)行開發(fā),jar
包以Spring Boot Starter
的方式發(fā)布似乎是不錯的選擇。
2 介紹#
Spring Boot Starter 和普通jar包的區(qū)別在于,Spring Boot Starter
?更加靈活,提供了自動裝配的機(jī)制,以及可供用戶配置等。下面以?加解密
作為例子,手寫一個?Spring Boot Starter
?,從實(shí)戰(zhàn)到原理去了解它的工作過程。
3 創(chuàng)建項(xiàng)目#
創(chuàng)建一個Spring Boot 的項(xiàng)目,項(xiàng)目命名為digest-spring-boot-starter
spring官方的包命名為:spring-boot-starter-xxx
第三方包命名為:xxx-spring-boot-starter
在pom.xml
中引入依賴commons-codec
(apache官方提供的加解密算法的工具包)
4 主體部分#
加密邏輯書寫,提供一個?Digest
?接口,使用常用的?Md5
和?Sha256
摘要算法進(jìn)行加密實(shí)現(xiàn)。
如果需要用戶來指定使用哪種加密算法,需要在application.properties
中添加一項(xiàng)配置:
digest.type=sha
創(chuàng)建一個配置類,拿到用戶配置的type:
日常開發(fā)中,比較常用的幾個注解為:
@ConditionalOnBean:當(dāng)容器中存在指定Bean的條件下
@ConditionalOnClass:當(dāng)類路徑匣有指定類的條件下
@ConditionalOnProperty:指定的屬性是否有指定的值
5 配置自動裝配#
在 resources 目錄下,創(chuàng)建一個文件夾名為?META-INF
,創(chuàng)建一個文件名為spring.factories
這一步是固定寫法
由于我們自己開發(fā)的starter
是沒有啟動類的,所以需要告訴引用 starter 的項(xiàng)目,需要去加載哪些類。
在spring.factories
中填寫:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xiaofengstu.digest.conf.Config
注釋掉pom.xml
中關(guān)于spring-boot-maven-plugin
的部分,以至于后續(xù)執(zhí)行?mvn package
?操作得到是一個標(biāo)準(zhǔn)的jar包。
再執(zhí)行mvn install
?將?starter
打包到本地倉庫中。
6 使用starter#
在需要的項(xiàng)目中引入剛剛打包好的starter
:
在代碼中直接注入?Digest
?即可:
總結(jié)#
spring boot 2.7+ 的版本,
spring.factorys
寫法稍有改動:

文件內(nèi)容,一行就是一個裝配類:

如果沒看明白的,可以參考一下?
mybatis-plus-spring-boot-starter
的寫法