经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
三分钟实战手写Spring Boot Starter
来源:cnblogs  作者:小冯同学c  时间:2023/2/22 15:23:30  对本文有异议

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官方提供的加解密算法的工具包)

  1. <dependency>
  2. <groupId>commons-codec</groupId>
  3. <artifactId>commons-codec</artifactId>
  4. </dependency>

4 主体部分

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

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

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

  1. digest.type=sha

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

  1. @Configuration
  2. @EnableConfigurationProperties
  3. @ConfigurationProperties(prefix = "digest")
  4. public class Config {
  5. private String type;
  6. /**
  7. * <bean id="md5Digest" class="com.xiaofengstu.digest.impl.Md5Digest"/>
  8. * @return Digest
  9. */
  10. @Bean
  11. @ConditionalOnProperty(prefix = "digest", name = "type", havingValue = "md5")
  12. public Digest md5Digest() {
  13. return new Md5Digest();
  14. }
  15. @Bean
  16. @ConditionalOnProperty(prefix = "digest", name = "type", havingValue = "sha")
  17. public Digest sha256Digest() {
  18. return new Sha256Digest();
  19. }
  20. }

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

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

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

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

5 配置自动装配

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

这一步是固定写法

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

spring.factories中填写:

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

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

再执行mvn installstarter打包到本地仓库中。

6 使用starter

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

  1. <dependency>
  2. <groupId>com.xiaofengstu</groupId>
  3. <artifactId>digest-spring-boot-starter</artifactId>
  4. <version>0.0.1-SNAPSHOT</version>
  5. </dependency>

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

  1. @Resource
  2. private Digest digest;

总结

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

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

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

原文链接:https://www.cnblogs.com/Fzeng/p/17141254.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号