如何自制一個Spring Boot Starter並推送到遠端公服
概 述
傳統的 Maven專案一般將需要被複用的元件做成 Module來進行管理,以便二次呼叫;而在 Spring Boot專案中我們則可以使用更加優雅的 Spring Boot Starter來完成這一切。
基於Spring Boot開發應用的過程可謂是幸福感滿滿,其開箱即用的特性分析已經在 《SpringBoot 應用程式啟動過程探祕》 一文中詳細敘述過了。這個開箱即用的魔法特性很大程度上來源於各式各樣 Spring Boot Starter的加持,而且隨著版本的迭代 Starter家族成員日益龐大,而且各種優秀開源作者也提供了很多非常好用的Spring Boot Starter。
本文則嘗試自制一個Spring Boot Starter並推送到遠端倉庫進行管理。
注: 本文首發於 My Personal Blog:CodeSheep·程式羊 ,歡迎光臨 小站
新建專案
本文準備封裝一個簡單的 MD5摘要工具的 Starter,命名為 md5test-spring-boot-starter
,其本質就是一個 Maven專案,只不過我們需要完善pom檔案的相關依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
編寫業務邏輯
首先提供一個 MD5Util
工具類,負責實際的 MD5加密:
public class MD5Util { public static String getMD5( String source ) { return getMD5( source.getBytes() ); } public static String getMD5(byte[] source) { String s = null; char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte tmp[]; synchronized ( MD5Util.class ) { md.update(source); tmp = md.digest(); } char str[] = new char[16 * 2]; int k = 0; for (int i = 0; i < 16; i++) { byte byte0 = tmp[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } s = new String(str); } catch (Exception e) { e.printStackTrace(); } return s; } }
再來提供一個 MD5Service
類 進行一次封裝
public class MD5Service { public String getMD5( String input ) { return MD5Util.getMD5( input.getBytes() ); } }
編寫自動裝配類
這一步十分重要,也是編寫 Spring Boot Starter最重要的一步:
@Configuration public class MD5AutoConfiguration { @Bean MD5Service md5Service() { return new MD5Service(); } }
當然此處可以說是最簡自動裝配類了,該部分其實還包含各種豐富的可控註解,可以 參考這裡 !
編寫spring.factories
我們還需要在 resources/META-INF/
下建立一個名為 spring.factories
的檔案,然後置入以下內容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.codesheep.auto.MD5AutoConfiguration
這一步也是相當重要哇,為什麼這一步這麼重要呢,因為我已經在文章 《SpringBoot 應用程式啟動過程探祕》 中講過了,Spring Boot自動注入的奧祕就來源於 Spring Boot應用在啟動過程中會通過 SpringFactoriesLoader
載入所有 META-INF/spring.factories
檔案,通過一系列的處理流程最終將 spring.factories 檔案中的定義的各種 beans
裝載入 ApplicationContext容器。
這一步搞定之後其實一個 Spring Boot Starter已經寫好了,接下來可以通過 mvn:install
打包,並傳到 私有/公有Maven倉庫以供使用了。
推送到遠端倉庫
很多公司都搭有私有的 Maven倉庫,但個人實驗可以藉助於 JitPack這個 “遠端公服”來為我們託管自制的 Spring Boot Starter。
我們將編寫好的 Spring Boot Starter程式碼置於 Github公有倉庫上,然後通過 JitPack來拉取我們的程式碼並打包生成Jar包即可
使用Spring Boot Starter
新建一個測試工程來測試一下我們編寫的 md5test-spring-boot-starter
。工程建立完畢後,在 pom.xml
中加入如下兩個元素:
- 新增 JitPack repository
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
- 新增
md5test-spring-boot-starter
依賴:
<dependency> <groupId>com.github.hansonwang99</groupId> <artifactId>md5test-spring-boot-starter</artifactId> <version>0.0.1</version> </dependency>
再編寫一個測試 Controller來測一下MD5摘要演算法的功能:
@RestController public class TestController { @Autowired private MD5Service md5Service; @RequestMapping("/test") public String getMD5() { return "MD5加密結果為:" + md5Service.getMD5("mypassword"); } }
呼叫 /test
介面後的加密結果為:
MD5加密結果為:34819D7BEEABB9260A5C854BC85B3E44
後記
由於能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!
- My Personal Blog: CodeSheep 程式羊
- 程式羊的 2018年終總(gen)結(feng)