SpringBoot的自定义starter开发
SpringBoot官方默认提供了很多的starter。参考官方的reference。starter作为在SpringBoot中重要的特性,使用时能够在POM文件中直接引用这些starter,可以一站式的获取与Spring结合的相关服务和功能。如果想引入redis
等功能。则直接添加使用spring-boot-starter-data-redis
。只需在配置文件中配置少量属性,就可以在应用中使用。
SpringBoot的自动配置原理
SpringBoot通过starter,引用相关服务,然后通过autoConfigure来自动配置相关服务。更多具体的实现可以参考这篇文章,在这篇文章中,简要的分析来如何实现自定义starter和基本的自动配置实现。
starter的基本结构
- 包名称以
spring-boot-starter-xxx
命名,如引用spring-boot-starter-data-jpa
.其中的内容只包括pom文件,用来引用相关服务的jar包。 - 包名称以
xxx-spring-boot-autoconfigure
命名。包含:- xxxAutoConfiguration 自动配置类,使用
Configuration
注解标志为配置类。使用Conditionalxxxx
相关注解表示条件,使用EnableConfigurationProperties
注解,来指定配置属性类。 - xxxProperties 配置属性类。使用
ConfigurationProperties
注解来标志为配置属性类,并且需要指定prefix
,以便在配置文件中,使用prefix+属性名来设置相关属性。 - spring.factories 文件中添加相关信息,用来指定需要进行自动配置的类的全限定名称。如:
- xxxAutoConfiguration 自动配置类,使用
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
开始自定义starter
在正式进行之前,需要先创建一个空的Project,用来放spring-boot-starter-xxx
和xxx-spring-boot-autoconfigure
。
创建spring-boot-starter-xxx和xxx-spring-boot-autoconfigure
在创建完空项目后,会要求创建module
。选择maven
或者Spring Initializer
进行spring-boot-starter-xxx
的创建。
配置starter
在实际操作配置starter之前,先来分析SpringBoot官方提供的starter的基本的依赖结构,为接下来的构建起到模版的作用。
在左边的为spring-boot-starter-web
的的简单的依赖关系,它依赖spring-boot-starter
。而spring-boot-starter
进一步依赖于spring-boot-autoconfigure
用来进行自动配置。
配置autoconfiguration包
pom配置
在pom.xml中添加如下内容:
1 | <dependencies> |
主要需要依赖spring-boot
。如果在自动配置类需要进行其他特殊的Conditional
设置时,还需要引入spring-boot-autoconfigure
。
添加xxxAutoConfiuration和xxxProperties类
这两个类是自动配置中必须的类。内容可以参考WebMvcAutoConfiguration
和WebMvcProperties
这两个类。下面是我的具体实现类。
1 | // HelloAutoConfiguration 自定义的AutoConfiguration类 |
spring.factories
如果想要使用自动配置,必须添加spring.factories
这个文件。添加如下内容:
1 | # Auto Configure |
配置 starter-xxx 包
pom配置
1 | <dependencies> |
项目结构
需要删除不需要的类或目录,如SpringBoot启动类、Resource目录、test目录。
打成jar包
使用idea中的maven工具,对上个module进行分别打包,安装到本地。打包的顺序是先安装 autoconfiuration
,然后再安装 starter-xxx
。
使用starter
新建一个web的SpringBoot项目,新建一个Controller,里面添加如下内容:
1 | "/sayHello") ( |
并在配置文件中添加:
1 | spring: |
在pom.xml中添加自定义的starter:
1 | <!-- 添加自定义starter --> |
运行程序,在地址栏上输入http://localhost:8081/sayHello