目录
前言
1、回顾
2、模式
3、实践
4、可能错误的点
我们知道,在Spring Boot项目开发过程中,如果要引入某个模块功能,都是通过在pom文件添加依赖,从而引入我们所需的功能。其实,我们所添加的依赖实质上便是一个个的starter。那么,有时我们可能不需要已有的starter,而是想引入我们自己写的某些依赖,这该如何实现呢?因此引入我们本部分的话题:自定义starter。
自定义starter时,我们面临两个问题:
1、这个场景需要使用到的依赖是什么?
2、如何编写自动配置?
在动手之前,我们先东施效颦,看看SpringBoot是如何实现一个starter的。我们仍然以WebMvcAutoConfiguration为例。开始之前,我们再回忆一下下列几个重要的基础注解。
@Configuration,用来指定这个类是一个配置类
@Configuration,指定这个类是一个配置类
@ConditionalOnXXX,在指定条件成立的情况下自动配置类生效
@AutoConfigureAfter,指定自动配置类的顺序
@Bean,给容器中添加组件
@ConfigurationPropertie,结合相关xxxProperties类来绑定相关的配置
@EnableConfigurationProperties,让xxxProperties生效加入到容器中
通过前面的学习,我们知道:自动配置类要能加载,则一定要将需要启动时就加载的自动配置类配置在META-INF/spring.factories(这句话稍稍有点绕,多读几遍)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\SpringBoot在编写starters时,是按照某种模式的。我们来看看这个模式:
启动器(starter):启动器模块是一个空 JAR 文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库。是不是又有点难理解,那就具体来看看:
我们在pom文件中看到,我们引入了spring-boot-starter-web这个启动器
但是我们在导入的依赖包中发现并没有任何的java文件
这说明:
启动器只用来做依赖导入;专门来写一个自动配置模块;启动器依赖自动配置,别人只需要引入启动器(starter)当然,说到这里,就涉及到一个小问题,那就是启动器(starter)的命名问题。其实命名一般遵循下列规则:
• 官方命名空间 前缀:“spring-boot-starter-” 模式:spring-boot-starter-模块名 举例:spring-boot-starter-web、spring-boot-starter-actuator、spring-boot-starter-jdbc • 自定义命名空间 后缀:“-spring-boot-starter” 模式:模块-spring-boot-starter 举例:mybatis-spring-boot-starter mybatis-spring-boot-starter;自定义启动器名-spring-boot-starter接下来我们就自己编写一个starter
开始之前,我们先创建一个空项目,在里面新建两个项目,一个是maven项目,一个是SpringBoot项目。完成后如下图:
接下来将这个配置项目不必要的内容都删除掉,我们只让它作为配置包。下图红框处都需要删除。
并将pom文件中不必要的依赖也删除掉,只留下关键的,引入spring-boot-starter,它是所有starter的基本配置。因此只留下下图中的依赖即可。
创建好的目录结构如下:
接下来我们在配置包里面新建三个类,分别是HelloProperties、HelloService和HelloServiceAutoconfiguration
首先是HelloService类,其中声明一个方法,是用来返回一个字符串,是用前缀+name+后缀组成的。
但是我们想把前后缀做成可配置的,因此我们创建HelloProperties类,在这里类中我们将前后缀做成可配置的
最后想要让这个配置起效果,我们就需要编写一个配置类,即HelloServiceAutoconfiguration
编写代码时,仍需要注意细节,例如某些注解可能会遗漏。起初就是因为没有写@Bean所以导致之后程序报错。
如果遗漏了@Bean,则在最终项目启动时,出现如下错误:
仔细检查控制台,会发现错误信息正是提示我们,com.aiguigu.starter.HelloService的helloService()头部少加了@Bean。
接下来我们在类路径下创建META-INF文件夹,并创建spring.factories文件,文件里面的内容可以参考maven依赖中已有的自动配置(思考为什么要建这个文件夹),不再赘述
完成后,我们把这两个模块安装到maven仓库中。这里注意一个小细节,因为starter包依赖了配置包,因此我们先install配置包!
期间Install时会报错,这时候我们删除掉test包便可
Install成功
成功之后我们如何测试starter是否的确写好了呢?
其实只需要创建另一个新的项目,创建好之后,在新项目的pom文件中引入我们自定义的starter坐标即可。
注意这里引入的内容,我们只是引入了之前写好的starter的坐标,其他的都无需管理
引入成功后,我们查看依赖管理,引入成功了。
之后编写逻辑代码,我们就仅仅给页面返回name
前后缀我们是可以配置的,在哪里配呢?看下图:
启动项目,打开浏览器,访问http://localhost:8090/helloTest
成功!这说明我们的启动器starter编写成功!
通过以上简单的实践,我们对SpringBoot项目中如何自定义starters有了一定的了解,但依然是浅显的,仍需后续不断学习。
在引入starter坐标后,会报如下错误:
这个starter坐标是引自这一部分:
注意,此时这个pom文件不是蓝色的maven项目pom,这时候我们需要右键这个pom文件
稍等片刻便好!
