b spring boot 入门介绍 28----创建一个自己的starter
文章目录
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
,是配置有哪些自动配置类
自动配置的类,只能以这种方式来定位。来确保他们在一个特殊的路径下,不被component scan自动扫描到。更重要的是auto-configuration类不应该打开组件扫面(componment scan)而是应该使用
@Import
你可以使用@AutoConfigureAfter
或 @AutoConfigureBefore
来配置顺序,你也可以定义@AutoConfigureOrder
来定义顺序。
四、条件注解
重要的特性,提供高级的规则来判断一个bean是否应该被装配。
我们有多种@Conditional
注解,@ConditionalOnMissingBean
最常用。proxyBeanMethods =flase
是5.2的新特性,让配置类不会被代理提高性能
具体看原文的使用方式
五、自动配置的测试
stater具体加载那些类是不确定的,是根据设置的条件生成的。所以有必要去设置测试,来检测是否成功配置。每种测试例子都需要自己的applicationContext
,ApplicationContextRunner
可以办到。ApplicationContextRunner
总是被当做filed被引入,如下可以生成一个applicationContext
包含uservices自动配置
具体配置见原文
模拟 a Web Context
需要servlet操作的,可以有WebApplicationContextRunner
和ReactiveWebApplicationContextRunner
Overriding the Classpath
有时候你要测试当类不存在时,会发生什么,spring boot 提供ships
方式给包改名字,达到包miss的效果。
六、创建你自己的starter
spring boot stater包含下面两个组件
- autoconfigure module 包含auto-configuration 代码
- starter模块依赖autoconfigure模块,也暴露给外界(额外的依赖)像一个坚果壳,提供启动所需的所有依赖。
naming
命名,不要以spring-boot开头。
比如你的starter叫acme
,可以这么命名模块acme-spring-boot-autoconfigure
和acme-spring-boot-starter
。
Configuration keys
配置键值对
配置建议
- 变量的描述不要以
the
或者a
开头 -
boolean
类型,请以Whether
或Enable
开头 - 数组类型,请以
,
分割的元素 - 使用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