目录
一、自己的理解
1. 理解一
2. 理解二
二、自定义starter(重点)
三、以mybatis-spring-boot-starter为例进行分析
1. 写好自己的自动配置类逻辑
2. 创建自己的starter项目并引入自动配置类项目的依赖
3. 在其它项目中使用自定义的starter
一、自己的理解
1. 理解一
自定义Starter的常规流程:
(1)自定义一个项目,叫做 xxx-spring-boot-autoconfigure (比如mybatis-spring-boot-autoconfigure), 在这个项目里面写自定义的配置类:xxxAutoConfiguration ---> xxxProperties,然后在项目的 META-INF/spring.factories文件中把自己的自动配置类配置进去(可以参照其它starter进行配置)从而使得项目启动自动加载指定的自动配置类;
(2)自定义一个项目,artifactId叫做xxx-spring-boot-starter (比如mybatis-spring-boot-starter)
(3)在(2)中引入(1)的依赖【即starter的pom文件里面引入autoconfigure包】
(4)在其它项目中使用自定义的Starter,就是引入(2)的依赖,然后在自己的配置文件中配置需要和xxxProperties绑定的配置信息,这样就可以在自己的项目中使用自定义的starter了。
2. 理解二
场景启动器里面没有源代码,场景启动器里面一般只负责在其pom文件里面声明这个场景启动器有哪些依赖,同时场景启动器里面引入了当前场景的自动配置依赖,而在自动配置包里面要引入springboot最底层的,每一个模块都要引入的spring-boot-starter,如下图:
二、自定义starter(重点)
根据 <理解二>中的图,自定义一个starter,其详细步骤如下:
(1) 创建一个空工程,空工程里面可以容纳多个项目,如下图:
(2)在新的空工程里面创建第一个模块(场景启动器starter模块)
shg-hello-spring-boot-starter 如下图:
(3)在新工程里面创建第二个模块(自动配置模块),如下图:
(4)场景启动器(shg-hello-spring-boot-starter) 里面需要引入 自动配置模块 (shg-hello-spring-boot-starter-autoconfigure),如下图:
(5)<自动配置>这个项目不需要启动,所以不需要主启动类,也不需要配置文件,可以把多余的东西删除,如下图:
(6)一个业务场景是这样的:比如有一个业务方法是<给别人打招呼>,其使用场景是你给我传入一个姓名,我给你输出一句问候语,并且这个问候语的格式是<可配置的前缀>+传入的姓名+<可配置的后缀>。
这个业务方法经常被使用,被多个模块使用,那么我就可以把这个业务方法抽取出来 。如下所示:
(7)在自动配置类的resource下创建 META-INF/spring.factories文件,在此文件中配置EnableAutoConfiguration 的值,这个值指定的就是需要在SpringBoot项目启动时自动加载的配置类(当然这个配置类生效与否还要看其是否满足自动配置类的条件),如下:
(8)打包项目并安装到本地仓库中
因为场景启动器要依赖自动配置包,所以要先打包自动配置包,再打包场景启动器;如下图:
至此就成功开发了自己的场景启动器,那么如何在其它项目中进行使用呢?接着看:
(8)新建一个测试项目,在其pom文件引入自定义的场景启动器,如下:
(9)直接编写业务方法,进行使用,如下:
(10)进行测试:
(11) 其它一些想法:
- 可以给HelloProperties的属性给定一些默认值,当其它项目使用我们的场景启动器(自定义starter时)如果没有在配置文件进行配置值,就使用我们默认给定的值;
- 条件装配(比如我们的自动配置类在给容器中添加组件时需要经过一些条件判断,当满足某种条件时才给容器中放入某个组件)
- ...
三、以mybatis-spring-boot-starter为例进行分析
1. 写好自己的自动配置类逻辑
说明:自动配置类里面需要的属性信息和xxxProperties类进行绑定
(1)自定义一个项目,artifactId叫做 <mybatis-spring-boot-autoconfigure>,如下图:
2. 创建自己的starter项目并引入自动配置类项目的依赖
(2)自定义一个项目,artifactId叫做xxx-spring-boot-starter (比如mybatis-spring-boot-starter)
(3)在(2)中引入(1)的依赖【即starter的pom文件里面引入autoconfigure包】,如下图:
3. 在其它项目中使用自定义的starter
(4)在其它项目中使用自定义的Starter,就是引入(2)的依赖,然后在自己的配置文件中配置需要和xxxProperties绑定的配置信息,这样就可以在自己的项目中使用自定义的starter了。