如何自制一個Spring Boot Starter並推送到遠端公服
傳統的 Maven專案一般將需要被複用的元件做成 Module來進行管理,以便二次呼叫;而在 Spring Boot專案中我們則可以使用更加優雅的 Spring Boot Starter來完成這一切。
基於Spring Boot開發應用的過程可謂是幸福感滿滿,其開箱即用的特性分析已經在 《SpringBoot 應用程式啟動過程探祕》
本文則嘗試自制一個Spring Boot Starter並推送到遠端倉庫進行管理。
一、新建專案
本文準備封裝一個簡單的 MD5摘要工具的 Starter,命名為 md5test-spring-boot-starter
,其本質就是一個 Maven專案,只不過我們需要完善pom檔案的相關依賴:
<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> <dependencies> ...... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> </dependencies>
1、編寫業務邏輯
首先提供一個 MD5Util
工具類,負責實際的 MD5加密:(這只是個案例,jdk8直接提供MD5加密,非常方便使用),放在 util 包下
package com.imddy.springboot.md5test.util; 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
類 進行一次封裝:(都是為了案例寫的),放在 service 包下
package com.imddy.springboot.md5test.service;
import com.imddy.springboot.md5test.util.MD5Util;
public class MD5Service {
public String getMD5( String input ) {
return MD5Util.getMD5( input.getBytes() );
}
}
2、編寫自動裝配類
這一步十分重要,也是編寫 Spring Boot Starter最重要的一步:(編寫專案springboot自動裝配類),放在 autoconfiguration 包下
package com.imddy.springboot.md5test.autoconfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.imddy.springboot.md5test.service.MD5Service;
@Configuration
public class MD5AutoConfiguration {
@Bean
MD5Service md5Service() {
return new MD5Service();
}
}
這個是最簡單的例子,可以參考 官網 的說明。
3、編寫spring.factories
我們還需要在 resources/META-INF/
下建立一個名為 spring.factories
的檔案,然後置入以下內容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.imddy.springboot.md5test.autoconfiguration.MD5AutoConfiguration
這一步也是相當重要哇,為什麼這一步這麼重要呢,文章《SpringBoot 應用程式啟動過程探祕》 中講過了,Spring Boot自動注入的奧祕就來源於 Spring Boot應用在啟動過程中會通過 SpringFactoriesLoader
載入所有 META-INF/spring.factories
檔案,通過一系列的處理流程最終將 spring.factories 檔案中的定義的各種 beans
裝載入 ApplicationContext容器。
這一步搞定之後其實一個 Spring Boot Starter已經寫好了。這裡還提供下pom.xml中的build
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 編譯原始碼版本和目標版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 資原始檔 utf-8編碼 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
接下來可以通過 mvn:install
打包,並傳到 私有/公有Maven倉庫以供使用了。
二、新建測試專案
專案名稱為:md5testtest-spring-boot-starter 測試上面的spring-boot-starter
新增依賴:
<dependency>
<groupId>com.imddy.springboot</groupId>
<artifactId>md5test-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
......
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
引入了 springboot 的 web 依賴。
貼下pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.imddy.springboot</groupId>
<artifactId>md5testtest-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>md5testtest-spring-boot-starter</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<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>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.imddy.springboot</groupId>
<artifactId>md5test-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 編譯原始碼版本和目標版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 資原始檔 utf-8編碼 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
編寫TestController (在 controller 包下):
package com.imddy.springboot.md5testtest.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.imddy.springboot.md5test.service.MD5Service;
@RestController
public class TestController {
@Autowired
private MD5Service md5Service;
@RequestMapping("/test")
public String getMD5() {
return "MD5加密結果為:" + md5Service.getMD5("mypassword");
}
}
編寫springboot的Application:
package com.imddy.springboot.md5testtest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
SpringApplication.run(Application.class, args);
}
}
執行結果如下:
三、他們把專案放到github中(國內支援gitee),通過https://jitpack.io實現直接在引入。
推送到遠端倉庫
很多公司都搭有私有的 Maven倉庫,但個人實驗可以藉助於 JitPack這個 “遠端公服”來為我們託管自制的 Spring Boot Starter。
我們將編寫好的 Spring Boot Starter程式碼置於 Github公有倉庫上,然後通過 JitPack來拉取我們的程式碼並打包生成Jar包即可
預設github.com的,支援國內的gitee.com。
輸入 http://github.com/lenglingx/bbupdate ,或者直接lenglingx/bbupdate 。
這裡輸入的是hansonwang99/md5test-spring-boot-starter 。
輸入 http://gitee.com/lenglingx/bbupdate 或者 com.gitee.lenglingx/bbupdate 都可以。