如何自定义一个spring-boot-starter(SpringBoot3之后)?
1 什么是spring-boot-starter
自动配置可谓是 SpringBoot 的最大亮点,在学习 SSM 框架的时候我们需要写一大堆的配置文件,并且因为配置的顺序、内容等等一系列问题使得及其容易出错,而在 SpringBoot 中,我们可以省去大量配置步骤,全身心投入到业务开发中。
我们通过导入各种 spring-boot-starter-xxx 依赖来自动配置我们需要的 Bean,例如 Spring 框架所需要的 Bean,我们只需要导入 spring-boot-starter 即可。
2 spring-boot-starter 命名规范
我们可以发现,官方定义的自动配置依赖都是以 spring-boot-starter-xxx 的样式命名的。
而一些第三方自动配置的依赖则是以 xxx-spring-boot-starter 的样式命名的。
3 定义 spring-boot-starter
3.1 创建模块
首先我们需要创建一个 SpringBoot 模块,
我们不需要选择任何依赖,直接创建即可,
3.2 定义自动配置类
我们需要指定我们的自动配置类,在 resources 下新建 META-INF/spring 目录,并在spring目录下新建org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(SpringBoot3.0改变自动配置的方式阅读SpringBoot官方文档可知这个变化似乎与云原生有关),在此文件中需要写入自动配置类的全限定类名,若有多个自动配置类则一行写一个
与我们编写业务逻辑时候相同,我们需要在配置类中定义自己的 Bean 交由 Spring 容器管理,而且自动配置依赖中,我们也是通过同样的方式,使用@Configuration 注解标记此类,并且与定义 Bean 一样的方式我们可以通过 @ConditionalOnXxx 注解来控制实例化的时机例如在某个 Bean 被实例化后才能实例化次配置类,
随后在次配置类中定义我们需要的 Bean ,
我们之后将此项目打包为 xxx-spring-boot-starter 并且作为依赖引入到某项目后便可使用定义的这个 demoBean 。
3.3 定义 SpringBoot 配置文件自动提示(可选)
我们在编写 application.properties(application.yml)配置文件的时候可以看到一系列提示信息,
这是因为我们使用的自动配置依赖帮我们定义了一系列配置元数据,我们可以通过 @ConfigurationProperties 配置来指定一个类中的属性作为配置文件的提示信息(必须提供 get/set 方法,否则无效),
此时 IDEA 会报错,因为 @ConfigurationProperties 注解并不具备将此类标记为 Spring 扫码类的功能,我们在业务开发中可以添加 @Component 注解将此类标记为扫描类即可解除 IDEA 报错,但是在自定义自动配置依赖的过程中,我们后续需要删除 SpringBoot 入口程序,这意外着添加 @Component 无法解决此问题,
我们需要提供 @EnableConfigurationProperties 注解将配置类与自动配置类绑定,即可将此类交由 Spring 容器管理,
我们可以在配置类的属性上添加配置的默认值,
到这里还是无法在配置文件中智能提示,我们需要添加 spring-boot-configuration-processor 依赖,
至此,自动提示功能的配置就大功告成。
3.4 打包项目
我们运行 package 后,便可在项目根目录的 target 目录下找到打包后的依赖。
4 使用 spring-boot-starter
我们可以将依赖放入本地 maven 仓库即可在 maven 中使用引入依赖,也运行 install 自动将此项目打包放入本地 maven 仓库。
将依赖引入项目即可使用我们在自动配置类中配置的Bean了。
5 如何实现热插拔功能
在引入依赖后,我们可以通过两种方式来决定是否启动自动配置,分别为通过 @ConditionalOnBean 注解与 @ConditionalOnProperty 注解两种方式。
5.1 通过 @ConditionalOnBean 注解
@ConditionalOnBean 注解可以将类实例化的时机移到某个Bean加载之后,
第一步,我们可以定义一个接口,当接口使用后此类即可被实例化,
第二步,使用 @ConditionalOnBean 将自动配置类实例化时机移到 @EnableDemoAutoConfiguration 接口加载后(接口使用后)。
5.2 通过 @ConditionalOnProperty 注解
@ConditionalOnProperty 注解可以将类是否实例化的选择放入配置文件中,
第一步,新增配置决定是否进行自动配置,属性默认为false,
第二步,使用 @ConditionalOnProperty 决定自动配置类与配置的关系,这里的配置为:当 demo.enable 为 true 时会实例化此自动配置类。
6 自定义 spring-boot-start 被依赖时 程序包不存在的问题
打包好依赖后导入新的项目,发现无法使用,
解决方法:在自定义依赖的 pom.xml 文件中添加以下信息。
<configuration>
<skip>true</skip>
</configuration>