1 背景

在平时的开发中,开发的同学会把一些通用的方法,写成一个工具类,例如日期转换的,JSON转换的等等,方便业务后续调用,使代码更容易维护。

如果一些更常用的方法,例如鉴权的,加解密的等等,几乎每个项目都会使用到,这时候开发的同学就会从以前的项目中再抄过来,随着项目的增多,几乎每个项目都有一份一模一样的工具类。经过技术评审决定,将这些工具类打包成jar包,后续的新项目可以直接以jar包的形式引入,重用就会变得非常的好。

由于项目本身是基于Spring Boot进行开发,jar包以Spring Boot Starter的方式发布似乎是不错的选择。

2 介绍

Spring Boot Starter 和普通jar包的区别在于,Spring Boot Starter 更加灵活,提供了自动装配的机制,以及可供用户配置等。下面以 加解密作为例子,手写一个 Spring Boot Starter ,从实战到原理去了解它的工作过程。

3 创建项目

创建一个Spring Boot 的项目,项目命名为digest-spring-boot-starter

spring官方的包命名为:spring-boot-starter-xxx

第三方包命名为:xxx-spring-boot-starter

在pom.xml中引入依赖commons-codec(apache官方提供的加解密算法的工具包)

       <dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>

4 主体部分

加密逻辑书写,提供一个 Digest 接口,使用常用的 Md5和 Sha256摘要算法进行加密实现。

public interface Digest {

    /**
* 摘要算法
* @param raw 字符串
* @return 加密后的字符串
*/
String digest(String raw); }
public class Md5Digest implements Digest {
@Override
public String digest(String raw) {
System.out.println("使用MD5算法生成摘要");
return DigestUtils.md5Hex(raw);
}
}
public class Sha256Digest implements Digest {
@Override
public String digest(String raw) {
System.out.println("使用SHA256算法生成摘要");
return DigestUtils.sha256Hex(raw);
}
}

如果需要用户来指定使用哪种加密算法,需要在application.properties中添加一项配置:

digest.type=sha

创建一个配置类,拿到用户配置的type:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "digest")
public class Config { private String type; /**
* <bean id="md5Digest" class="com.xiaofengstu.digest.impl.Md5Digest"/>
* @return Digest
*/
@Bean
@ConditionalOnProperty(prefix = "digest", name = "type", havingValue = "md5")
public Digest md5Digest() {
return new Md5Digest();
} @Bean
@ConditionalOnProperty(prefix = "digest", name = "type", havingValue = "sha")
public Digest sha256Digest() {
return new Sha256Digest();
}
}

日常开发中,比较常用的几个注解为:

@ConditionalOnBean:当容器中存在指定Bean的条件下

@ConditionalOnClass:当类路径匣有指定类的条件下

@ConditionalOnProperty:指定的属性是否有指定的值

5 配置自动装配

在 resources 目录下,创建一个文件夹名为 META-INF,创建一个文件名为spring.factories

这一步是固定写法

由于我们自己开发的starter是没有启动类的,所以需要告诉引用 starter 的项目,需要去加载哪些类。

在spring.factories中填写:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xiaofengstu.digest.conf.Config

注释掉pom.xml中关于spring-boot-maven-plugin的部分,以至于后续执行 mvn package 操作得到是一个标准的jar包。

再执行mvn install 将 starter打包到本地仓库中。

6 使用starter

在需要的项目中引入刚刚打包好的starter:

	<dependency>
<groupId>com.xiaofengstu</groupId>
<artifactId>digest-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

在代码中直接注入 Digest 即可:

@Resource
private Digest digest;

总结

  1. spring boot 2.7+ 的版本,spring.factorys写法稍有改动:

    文件内容,一行就是一个装配类:

  2. 如果没看明白的,可以参考一下 mybatis-plus-spring-boot-starter的写法

三分钟实战手写Spring Boot Starter的更多相关文章

  1. 自己写spring boot starter

    自己写spring boot starter 学习了:<spring boot实战>汪云飞著 6.5.4节 pom.xml <project xmlns="http://m ...

  2. 手把手教你手写一个最简单的 Spring Boot Starter

    欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...

  3. Spring Boot Starter自定义实现三步曲

    实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...

  4. 年轻人的第一个自定义 Spring Boot Starter!

    陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...

  5. 从零开始开发一个Spring Boot Starter

    一.Spring Boot Starter简介 Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件 ...

  6. 手写Spring MVC

    闲及无聊 又打开了CSDN开始看一看有什么先进的可以学习的相关帖子,这时看到了一位大神写的简历装X必备,手写Spring MVC. 我想这个东西还是有一点意思的 就拜读了一下大佬的博客 通读了一遍相关 ...

  7. AI应用开发实战 - 手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

  8. 一个老程序员是如何手写Spring MVC的

    人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...

  9. Spring Boot (一): Spring Boot starter自定义

    前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...

  10. 我是这样手写 Spring 的(麻雀虽小五脏俱全)

    人见人爱的 Spring 已然不仅仅只是一个框架了.如今,Spring 已然成为了一个生态.但深入了解 Spring 的却寥寥无几.这里,我带大家一起来看看,我是如何手写 Spring 的.我将结合对 ...

随机推荐

  1. audio解决不能自动播放问题

    问题描述 无法实现打开网页就能自动播放音乐 正常情况下使用autoplay即可实现自动播放,但是现在打开网页该参数无效 原因分析: 根据最新的规范,Chrome系浏览器,没有交互过的网站默认禁止自动播 ...

  2. 【Java EE】Day14 Servlet、HTTP、Request

    一.Servlet 二.HTTP 三.Request 四.登录案例

  3. NavigationDuplicated Navigating to current location (“/XXX”) is not allowed

    导航不允许导航到当前位置https://stackoverflow.com/questions/57837758/navigationduplicated-navigating-to-current- ...

  4. gulp报错The following tasks did not complete

    代码如下: //引用gulp模块 const gulp = require('gulp'); //使用gulp.task()建立任务 gulp.task('first', () => { con ...

  5. 微软出品自动化神器【Playwright+Java】系列(六) 之 字符输入、单元素键盘事件操作、上传文件、聚焦、拖拽、悬浮操作

    前言: 今天一早起床,就一直太阳穴疼,吃了四片去痛片已经无效,真的是疼的直恶心. 如果说学习或者写文章,能够或者头疼的话,那我想说,我还能坚持一会..... 很久没更新这系列的文章了,那么我们将Pla ...

  6. JavaScript:代码细节和良好编码习惯

    这些细节,与语法无关,仅仅是编写代码时需要注意的最最基本的细节和一些良好编码习惯. 注释代码 注释代码分为单行注释和多行注释,如下所示: 严格区分大小写 JS的代码时严格区分大小写的,变量a和A是不同 ...

  7. 快速排序算法实现 (y总课后)

    主要思路: 1.确定 边界 l----------r  (left right) 2.确定中间值  l--------x----------r 3.优雅快排: 设置两个指针i,j. i从左边开始运行 ...

  8. Request.Form&Request.QueryString实现伪ajax的效果

    1.问题描述 最近一直在搞公司老系统的需求开发,前端是asp,后端的vb.碰到了一个需求,是做一个"日志查询"功能,查询条件为:时间&操作人. 原本我的设计思路是异步查询, ...

  9. 字符编码和字符集-FileReader读取jbk格式的文件

    字符编码和字符集 字符编码 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果.按照某种规则,将字符存储到计算机中,称为编码.反之,将 ...

  10. 数学工具类Math-练习

    数学工具类Math 概述 java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数.类似这样的工具 类,其所有方法均为静态方法,并且不会创建对象,调用起来非常 ...