SpringBoot——自定义starters(启动器)

    科技2022-08-16  115

    目录

     

    前言

    1、回顾

    2、模式

    3、实践

    4、可能错误的点


    前言

    我们知道,在Spring Boot项目开发过程中,如果要引入某个模块功能,都是通过在pom文件添加依赖,从而引入我们所需的功能。其实,我们所添加的依赖实质上便是一个个的starter。那么,有时我们可能不需要已有的starter,而是想引入我们自己写的某些依赖,这该如何实现呢?因此引入我们本部分的话题:自定义starter

    自定义starter时,我们面临两个问题:

    1、这个场景需要使用到的依赖是什么?

    2、如何编写自动配置?

    1、回顾

    在动手之前,我们先东施效颦,看看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时,是按照某种模式的。我们来看看这个模式:

    2、模式

    启动器(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

    3、实践

    接下来我们就自己编写一个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有了一定的了解,但依然是浅显的,仍需后续不断学习。

    4、可能错误的点

    在引入starter坐标后,会报如下错误:

    这个starter坐标是引自这一部分:

    注意,此时这个pom文件不是蓝色的maven项目pom,这时候我们需要右键这个pom文件

    稍等片刻便好!

     

    Processed: 0.031, SQL: 10