前面的文章我们已经了解了Spring Boot的自动配置原理及应用的整个启动流程,相信大家看完之后都能有一些收获。但是光有理论知识还不足以让我们的代码高大上啊,要是哪天同事需要对接咱写的功能,反手一个starter给他是不是马上成就感满满?哈哈,扯远了……
自定义starter在我们的日常工作中还是非常常见的需求,这篇文章我们就来介绍一下如何自定义一个starter,以及自定义starter在项目中的一些实际应用场景。
我们这个自定义的starter要实现什么功能呢?很简单:
- 自动装载并对外提供一个HelloWorldService类的bean,包含一个sayHello()方法
- 能够自动读取并输出配置文件中的属性值
添加依赖
首先,我们新建一个Maven项目,引入spring-boot-autoconfigure依赖:
添加业务Service
其次,新建一个叫HelloWorldService的类:
接着,新建一个叫HelloWorldProperties的类:
@ConfigurationProperties(prefix = "funcode.helloworld")
该注解的作用是读取配置文件中以funcode.helloworld开头的键,并将值绑定到HelloWorldProperties类的对应的属性上。
自动配置类
接下来,我们今天的主角即将登场,新建一个叫HelloWorldAutoConfiguration的类:
该类是实现自定义starter的关键,其中有几个点解释一下:
- @Configuration表明这个类是一个配置类
- @EnableConfigurationProperties(HelloWorldProperties.class)意思是激活我们的HelloWorldProperties配置类,激活的意思就是说IoC容器已经加载这个bean,它可以被注入到其他地方。
- @ConditionalOnMissingBean(HelloWorldService.class)其实根据字面意思差不多就能理解,意思就是只有HelloWorldService类型的bean不存在时才会自动加载该bean实例,如果IoC容器中已经存在了该类的bean,则不会再自动加载。
现在,bean类有了、属性绑定类有了、自动配置文件也有了,是不是已经全部完成了呢?
并不是,虽然所有的需要的文件都有了,但是Spring Boot它并不知道这些文件的存在,我们必须告诉他去哪里加载我们的自动配置文件。
添加spring.factories文件
如果看过之前的Spring Boot实现自动配置的原理的文章,那么你就知道我们还需要在项目resources目录下新建META-INF目录、并新建一个spring.factories文件:
到这一步,我们就完成了自定义一个starter的所有工作,现在我们就到项目中引用一下这个starter吧。
引用自定义starter
首先我们在pom文件中引入自定义的starter:
接着我们新建一个HelloWorldController类,并将HelloWorldService注入进来:
接下来我们在配置文件里添加一个属性funcode.helloworld.name:
最后我们运行一下项目,可以看到页面成功输出我们配置的信息:
特别注意:
如果你跟着这篇文章在做,这时候你可能会发现在配置我们自定义starter里面的属性的时候,我们的编辑器并没有像平时使用官方starter那样智能提示我们有哪些可配置的属性,是什么原因导致的呢?要是我们自定义的starter有很多属性,使用起来那也太不方便了吧?
别急,其实只要在我们的自定义starter里多引入一个依赖即可:
重新编译、打包一下我们的starter,再来配置一下属性,是不是有提示了:
总结
自定义starter的使用场景通常是封装一些通用的、公共的的组件以方便他人使用,一些常用到的地方如:
- 发送邮件、短信验证码之类的常用功能可以统一抽取成一个starter,其他项目要使用时直接依赖即可调用
- 数据库mapper层可以抽取封装成一个starter,其他项目需要使用数据库时直接依赖即可,不在需要每个项目单独提供数据库链接配置类
- 登录、鉴权之类的公共功能同样可以抽取封装成一个starter,这样就不用每个项目都写一遍了
其他更多、更好的使用场景就留给大家一起来挖掘吧。