b spring boot 入门介绍 28----创建一个自己的starter

—> go to 总目录


starter的demo

一、什么时候需要starter

打当你开发一个需要被人使用的lib,或者使用商业的lib时,你可以做一个自动装配的starter,可以被spring boot 自动设置

二、理解Auto-configured bean

首先auto-configuration是一个 @Configuration的实现。同时额外的加上了
@Conditional注解。
通常auto-configuration类使用@ConditionalOnClass@ConditionalOnMissingBean注解以便于判断是否符合自动装配的条件。----其依赖的类或者配置是否存在

三、spring boot如何找到starter

在你starter的jar包的目录下META-INF/spring.factories,是配置有哪些自动配置类
b spring boot 入门介绍 28----创建一个自己的starter

自动配置的类,只能以这种方式来定位。来确保他们在一个特殊的路径下,不被component scan自动扫描到。更重要的是auto-configuration类不应该打开组件扫面(componment scan)而是应该使用@Import

你可以使用@AutoConfigureAfter@AutoConfigureBefore 来配置顺序,你也可以定义@AutoConfigureOrder来定义顺序。

四、条件注解

重要的特性,提供高级的规则来判断一个bean是否应该被装配。
我们有多种@Conditional注解,
@ConditionalOnMissingBean最常用。
b spring boot 入门介绍 28----创建一个自己的starter
proxyBeanMethods =flase是5.2的新特性,让配置类不会被代理提高性能
具体看原文的使用方式

五、自动配置的测试

stater具体加载那些类是不确定的,是根据设置的条件生成的。所以有必要去设置测试,来检测是否成功配置。每种测试例子都需要自己的applicationContext,
ApplicationContextRunner可以办到。
ApplicationContextRunner总是被当做filed被引入,如下可以生成一个applicationContext包含uservices自动配置
b spring boot 入门介绍 28----创建一个自己的starter
具体配置见原文

模拟 a Web Context

需要servlet操作的,可以有WebApplicationContextRunnerReactiveWebApplicationContextRunner

Overriding the Classpath

有时候你要测试当类不存在时,会发生什么,spring boot 提供ships方式给包改名字,达到包miss的效果。
b spring boot 入门介绍 28----创建一个自己的starter

六、创建你自己的starter

spring boot stater包含下面两个组件

  • autoconfigure module 包含auto-configuration 代码
  • starter模块依赖autoconfigure模块,也暴露给外界(额外的依赖)像一个坚果壳,提供启动所需的所有依赖。

naming

命名,不要以spring-boot开头。
比如你的starter叫acme,可以这么命名模块acme-spring-boot-autoconfigureacme-spring-boot-starter

Configuration keys

配置键值对
b spring boot 入门介绍 28----创建一个自己的starter
配置建议

  • 变量的描述不要以the或者a开头
  • boolean类型,请以WhetherEnable开头
  • 数组类型,请以,分割的元素
  • 使用java.time.Duration要比long来描述时间好的多,当没有单位时默认是秒

autoconfigure Module

这个模块包含了,启动时必须要要实例化的依赖。可能会包含上述Configuration keys的定义,比如@ConfigurationProperties;和初始化用的callback函数。

你应该去标识你的依赖为可选的,暴露给springboot来选择是否是关闭这些依赖

Spring Boot使用注解驱动的 processor,来收集自动配置条件(可以配置在文件里META-INF/spring-autoconfigure-metadata.properties),如果有这个文件,就会被用来过滤不需要配置的类,来节约启动时间。
推荐在autoconfigure加入如下的配置。

Starter Module

这个模块真的就知识一个空模块而已,只是为了提供一个必要的依赖而已。你可以把它想成一个view而已。
不要假定的stater需要的一些条件被加载了。典型的你的stater可能需要其他starter,也要留意他们。同时提供一个默认的依赖是困难的,尤其是提供了大量可选的条件,你应该避免把必须要用的依赖设为可选,换句话说你把常用的依赖,不要设为可选。

有两种使用方式,你的starter必须直接引用spring-boot-starter;你的stater依赖其他strter,简介的依赖了spring-boot-starter

具体还得看demo