前言
在了解Springboot的自动配置原理后,就可以来实现自定义starter,不懂的可以看该系列之前的文章
除此之外还需要知道为什么要去自定义starter,在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,SpringBoot为我们完成自动装配。
源码
首先创建一个空项目,在该项目下创建两个模块
命名规则
SpringBoot提供的starter以spring-boot-starter-xxx
的方式命名的。官方建议自定义的starter使用xxx-spring-boot-starter
命名规则。以区分SpringBoot生态提供的starter。
首先在启动器模块的pom文件中添加自动配置模块的依赖,这样别的项目需要使用时只需要引入该启动器即可。
在自动配置模块的pom中只需要留下web场景启动器即可,启动类也可以删掉,然后写个用于后面测试的service
来看一下用到的PropertiesBean, 以com.lonewalker为前缀,这样就可以从properties文件中取值。
@ConfigurationProperties(prefix = "com.lonewalker") public class PropertiesBean { private String prefix; private String suffix; public String getPrefix() { return prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } public String getSuffix() { return suffix; } public void setSuffix(String suffix) { this.suffix = suffix; } }
接下来写自动配置类 HelloAutoConfiguration , 当容器中没有HelloService时才生效,以用户配置优先。@EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。
@Configuration @ConditionalOnMissingBean(HelloService.class) @EnableConfigurationProperties(PropertiesBean.class) public class HelloAutoConfiguration { @Bean public HelloService helloService(){ return new HelloService(); } }
还有很重要的一步,新建META-INF文件,在该文件下新建spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.lonewalker.lonewalkerhellospringbootautoconfiguer.auto.HelloAutoConfiguration
大功告成,把两个模块都install一下
测试
新建test项目,在pom文件中加入自定义starter信息
properties文件中添加所需信息
直接在测试类测试吧,完美