vlambda博客
学习文章列表

创建SpringBoot自动配置:自定义Starter项目

创建SpringBoot自动配置项目

经过前面章节的学习,我们已经了解了 Spring Boot 的核心运作原理,同时也学习了几个常用框架的自动配置机制及源代码解析。Spring Boot 默认实现了许多的 starter,可以在项目中快速集成。但如果我们所需的 starter 并不在其中,又想借鉴 Spring Boot 的 starter 的创建机制来创建自己框架 starter,该怎么办呢?本章将带领大家创建一个自定义的 starter 项目。

在具体实践的过程中我们会经常遇到这样的情况,比如几个项目都需要发送短信验证码的子项目(针对大多数没有采用服务化的场景)。那么,最笨的方法就是每个项目中都重新写一份执行程序, 或者更进一步是创建一 个单独的子项目,然后每个项目都依赖 jar 包。如果项目采用的是 Spring Boot 的项目框架,那事情就会变得更加简单,这时候 Spring Boot 的自动配置便派上用场了

下面,我们就以发送短信验证码这样的场景来自定义- -个 starter.在此之前,我们先总结一下之前讲解的自动配置 starter 的基本条件。

首先,需要在 classpath 中存 在用于判断是否进行自动配置的类;然后,当满足这些条件之后,需要通过自定义的 Bean 将其实例化并注册到容器中;最后,这一过程通过 Spring Boot自动配置的机制自动完成。关于自动配置机制的实现,我们已经在前面章节中详细讲述过了。


自定义SpringBootStarter项目

这里通过 maven 项目管理工具进行 starter 的创建。首先创建一个简单的 maven 项目,该项目可通过 Intellj idea 等 IDE 进行创建,也可通过 maven 命令进行创建。创建之后项目的目录结构如下。

-一 spring - boot-starter-msg. iml
-main
test

在完成了项目的创建和基础依赖的添加之后,便开始相应功能的实现。首先,创建一个MsgService 类。该类不仅提供了短信发送的功能实现,也会被用于 Spring Boot 判断是否进行自动配置的核心类。而后者的场景就是 SpringBoot 用于检查 classpath 中是否存在该类。

<dependency>
<groupId>org. spri ngframework . boot< / groupId>
<artifactId>spring- boot - autoconfigure</ artifactId>
<version>2.2.1. RELEASE</version>
</ dependency>

在 MsgService 中用到了一一个工具类 HttpClientUtils。在 HttpClientUtils 这里仅以打印请求的参数信息用作示例,生产环境中根据具体场景进行实现。

public class HttpClientUtils {
public static int sendMsg(String url, String accessKeyId, String accessKe
Secret, String msg
)
{
// TODO 调用指定 url 进行请求的业务逻辑
System. out . println("Http 请求,url=" + url + ";accessKeyId=" + accessKey
Id +
";accessKeySecret=" + accessKeySecret + ";msg=" + ms
g)
return 0; }}

完成了基础的功能类实现之后,下一步提供自动配置的属性配置类 MsgProperties,它的作用是封装 application.properties 或 application.yml 中的基础配置。在这里就是关于短信发送的基础参数,前缀统一采用 msg, 通过@ConfigurationProperties 注解来进行对应属性的装配。

@ConfigurationProperties(prefix = "msg")
public class MsgProperties {
/**
访问发送短信的 url 地址
private String url;
/**
短信服务商提供的请求 keyId
private String accessKeyId;
/**
短信服务商提供的 KeySecret
private String accessKeySecret;
//省略 getter/setter 方法
}

有了属性配置类和服务类,下面就是通过自动配置类将其整合, 并在特定条件下进行实例化操作。自动配置类本质上就是一个普通的 Java 类 ,通过不同的注解来对其赋予不同的功能。

@Configuration
@ConditionalOnClass (MsgService. class)
@EnableConfigurationProperties (MsgProperties.class)
public class MsgAutoConfiguration {
/**
注入属性配置类
@Resource
private MsgProperties msgProperties;
@Bean
@ConditionalOnMissingBean(MsgService.class)
@ConditionalOnProperty(prefix = "msg", value = "enabled", havingValue =
"true")
public MsgService msgService() {
MsgService msgService = new MsgService(msgProperties. getUr1(), msgPrope
rties.
msgProperties . getAccessKeySecret());
/如果提供了其他 set 方法, 在此也可以调用对应方法对其进行相应的没置或初始化
return msgService;
}
}

MsgAutoConfiguration 类 上 的 注 解 , @Configuration 用 来 声 明 该 类 为 一 个 配 置类;@ConditionalOnClass 注解表示只有当 MsgService 类存在于 classpath 中,该类才会进行相应的实例化; @
EnableConfigurationProperties 会将 application.properties 中对应的属性配置设置于 MsgProperties 对象中。


MsgAutoConfiguration 的 msgService 方法上的注解,@Bean 表明该方法实例化的对象会被加载到容器中; @ConditionalOnMissingBean 表示当容 器中不存在 MsgService 的对象时,才会进行实例化操作;

@ConditionalOnProperty 表示当配置文件中 msg.enabled=true 时才进行相应的实例化操作,默认情况下不会进行实例化操作。

基本功能已经完成,我们只需要将 MsgAutoConfiguration 类进行自动配置注册即可。在前面的章节中我们已经了解到,凡是 classpath' 下 jar 包中 META-INF/spring.factories 中的配置 ,在 Spring Boot 启动时都会进行相应的扫描加载。因此,我们无须直接修改 SpringBoot 的 spring.factories 文件, 只需在新建的 starter 项目中添加对应目录和文件即可。

在当前项目的 resources 目录下创建 META-INF/spring.factories 文件,并对自动配置类进行注册。如果有多个自动配置类,用逗号分隔换行即可。

org. springframework . boot . autoconfigure . EnableAutoConfiguration=\com. secbro2 .
msg. MsgAutoConfiguration

至此,一个基于Spring Boot 的自动配置 starter 便完成了。使用 maven 将其打包到本地仓库或上传至私服,其他项目便可以通过 maven 依赖进行使用。


本文给大家讲解的内容是创建SpringBoot自动配置项目:自定义Spring BootStarter项目

  1. 1.下篇文章给大家讲解的是创建SpringBoot自动配置项目:Starter测试使用;

  2. 2.觉得文章不错的朋友可以转发此文关注小编;

  3. 3.感谢大家的支持!