SpringBoot基础 SpringBoot系列之动手制作一个starter包 2021-05-07 [TOC] # 自定义Spring Boot Starter详解 ## 一、Spring Boot的一些约定 一个组件的设计一定要有标准和规则。Spring Boot Starter的标准和规则如下: **命名风格:** - ①groupId不要用官方的org.springframework.boot而要用你自己独特的 - ②artifactId的命名,Spring Boot官方建议非官方的Starter命名格式遵循 xxxx-spring-boot-starter - ③官方starter会遵循spring-boot-starter-xxxx **例如:** - mybatis-spring-boot-starte 非官方 - spring-boot-starter-undertow 官方 ## 二、自定义一个Starter,以第三方短信业务为例 **整体结构图:** ![](/uploads/1/image/public/202105/20210507114701_c1g6gmw87f.png) **代码结构图:** ![](/uploads/1/image/public/202105/20210507140308_fh4gr6i8m7.png) **模块代码说明:** - ①sms-spring-boot,引入BOM,添加依赖管理。主要管理该Starter的所有模块module及三方依赖。 - ②sms-spring-boot-autoconfigure,该模块主要用来定义配置参数、以及自动配置对外暴露的功能(一般是抽象的接口Spring Bean) - ③sms-spring-boot-starter,该模块是一个空jar。它唯一目的是提供必要的依赖项来使用starter,必须直接或间接引用核心Spring Boot启动器(spring-boot-starter) ### 具体操作步骤: - 第一步:创建maven项目 - 其中pom.xml内容如下: ![](/uploads/1/image/public/202105/20210507142314_7hhkfdjfkw.png) > 注:写starter时,在pom中配置spring-boot-autoconfigure-processor,在编译时会自动收集配置类的条件,写到一个META-INF/spring-autoconfigure-metadata.properties中。 ![](/uploads/1/image/public/202105/20210507151436_c2b3rx2ebk.png) **作用:对配置文件中的配置项生成一些提示相关的信息。如下:** ![](/uploads/1/image/public/202105/20210507151552_15curvevss.png) - 第二步:写自动配置及逻辑 - 各种condition: | 类型 | 注解 | 说明 | | ------------------------------------------------------- | ----------------------------- | ------------------------------------------------------------ | | Class Conditions类条件注解 | @ConditionalOnClass | 当前classpath下有指定类才加载 | | @ConditionalOnMissingClass | 当前classpath下无指定类才加载 | | | Bean ConditionsBean条件注解 | @ConditionalOnBean | 当期容器内有指定bean才加载 | | @ConditionalOnMissingBean | 当期容器内无指定bean才加载 | | | Property Conditions<br />环境变量条件注解(含配置文件) | @ConditionalOnProperty | prefix 前缀name 名称havingValue <br />用于匹配配置项值matchIfMissing <br />没找指定配置项时的默认值 | | ResourceConditions 资源条件注解 | @ConditionalOnResource | 有指定资源才加载 | | Web Application Conditionsweb条件注解 | @ConditionalOnWebApplication | 是web才加载 | | @ConditionalOnNotWebApplication | 不是web才加载 | | | SpEL Expression Conditions | @ConditionalOnExpression | 符合SpEL 表达式才加载 | > 如:选用@ConditionalOnProperty,即配置文件中有aspectLog.enable=true,才加载我们的配置类 - **①在Spring Boot 的application.yml中,定义一个前缀标识来作为名称空间隔离各个组件的参数,如:Sms;** ![](/uploads/1/image/public/202105/20210507150823_x2vhi7ip5m.png) - **②以前缀+Properties来定义一个对应的组件,自动装配这些参数(自动装配的机制基于@ConfigurationProperties注解,要显示声明);** ![](/uploads/1/image/public/202105/20210507151017_4ghnanqawj.png) - ③配置自动暴露功能接口 > 拿到配置后,根据配置初始化功能接口,抽象一个短信发送接口SmsSender(根据短信提供方的SDK来进行功能设计),依赖坐标optional必须配置为true,最终实现功能接口 - ④编写自动配置类 SmsAutoConfiguration > 通过注解@Configuration、@ConfigurationProperties将配置类SmsProperties加载进来。然后将我们需要暴露的功能接口声明为Spring Bean 暴露给Spring Boot应用 - 第三步:starter集成入应用 两种方式:主动生效和被动生效;主动生效,在starter组件集成入Spring Boot应用时需要你主动声明启用该starter才生效。通过@Import注解,将该注解标记到你自定义的@Enable注解上: ![](/uploads/1/image/public/202105/20210507153042_02i5wemq0v.png) 另一种被动生效,在starter组件集成入Spring Boot应用时就已经被应用捕捉到。这里会用到类似java的SPI机制。在autoconfigure资源包下新建META-INF/spring.factories写入SmsAutoConfiguration全限定名 ![](/uploads/1/image/public/202105/20210507153138_0281992vkx.png) 多个配置类逗号隔开,换行使用反斜杠。 到此为止,我们的整个短信Starter就开发完成了。