Profile
概 述
传统的 Maven 项目一般将需要被复用的组件做成 Module 来进行管理, 以便二次调用; 而在 Spring Boot 项目中我们则可以使用更加优雅的 Spring Boot Starter 来完成这一切.
本文则尝试自制一个 Spring Boot Starter 并推送到远端仓库进行管理.
注: 本文首发于 My Personal Blog:CodeSheep. 程序羊 https://www.codesheep.cn/ , 欢迎光临 小站 https://www.codesheep.cn/
新建项目
本文准备封装一个简单的 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 程序羊 http://www.codesheep.cn/
程序羊的 2018 年终总 (gen) 结(feng) https://www.codesheep.cn/2018/12/31/2018summary/
来源: http://www.jianshu.com/p/ee533e420ac5