Spring boot如何写一个自定义的auto-configuration(下)
定义需求
就比如写一个很简单的redis配置的starter, 规定好redis的url就可以使用redis的client
编写starter
首先理解一下spring boot的原理:
通过一些condition的判断,来启用或者不启用使用bean方式的配置。这个会有Spring boot负责扫描每个jar下的META-INF/spring.factories中的key有哪些。
其次理解一下spring boot自动配置设计的结构.
parent module
负责定义pom的dependency management,用来引用依赖的版本
starters module
负责定义有多少个starter, 继承于parent module
starter module
负责额外共同的依赖,比如autoconfigure, logging, yaml等
具体的starter module,比如web
空的module,只负责定义这个功能还需要哪些依赖。
接下来来具体实际干吧,但是贴代码有点繁琐,所以只说步骤。
建立工程cn.kevin.spring.boot,并建立相应的.gitignore文件
建立dependencies module,这个负责定义依赖,承担的是spring boot的parent角色。注意的是,这里的
packaging
类型必须是pom
建立starter module,这一步是可选的,因为如果模块不多的话,可以在具体的模块中引用
建立autoconfigure module,用来读取配置文件中的属性。这里要注意的是,可能我们需要检测到某个class存在才启用。一定不要写成
@ConditionOnBean
了,正确的应该是@ConditionOnClass
. 这个模块也要集成dpenencies模块建立具体的starter module, 来定义额外的依赖。这个模块也要继承于dependencies模块
发布到maven.
实际测试的时候只要建立了redis,然后配置相应的url,就应该能够成功引用到了jedis实例和集群。
Tips:
在测试的时候可能需要观察自动配置是否被启用了,可以开启spring boot的report。 正常启动应用加参数
--debug
, 使用Junit测试的时候,加上这个@TestPropertySource(properties = "debug=true")
。会列出来启用的状态,及为什么这样写可能会有点麻烦,因为有的依赖很简单,可以将autoconfigure和starter合二为一,因为你会发现autoconfigure依赖已经足够了
结束了。代码在此
首次理解spring boot的结构还是有点麻烦的,不过理解之后设计挺好的。