V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX  ›  Blogger

如何自制一个 Spring Boot Starter 并推送到远端公服

  •  
  •   hansonwang99 · 2019-01-24 07:41:25 +08:00 · 1389 次点击
    这是一个创建于 1890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Profile


    概 述

    传统的 Maven 项目一般将需要被复用的组件做成 Module 来进行管理,以便二次调用;而在 Spring Boot 项目中我们则可以使用更加优雅的 Spring Boot Starter 来完成这一切。 基于 Spring Boot 开发应用的过程可谓是幸福感满满,其开箱即用的特性分析已经在 《 SpringBoot 应用程序启动过程探秘》一文中详细叙述过了。这个开箱即用的魔法特性很大程度上来源于各式各样 Spring Boot Starter 的加持,而且随着版本的迭代 Starter 家族成员日益庞大,而且各种优秀开源作者也提供了很多非常好用的 Spring Boot Starter。

    本文则尝试自制一个 Spring Boot Starter 并推送到远端仓库进行管理。


    新建项目

    本文准备封装一个简单的 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
    

    后记

    由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



    1 条回复    2019-01-24 07:44:26 +08:00
    putaozhenhaochi
        1
    putaozhenhaochi  
       2019-01-24 07:44:26 +08:00 via Android
    推广节点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5241 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:38 · PVG 17:38 · LAX 02:38 · JFK 05:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.