Spring Boot Starter是在SpringBoot组件中被提出来的一种概念。传统的 Spring 项目想要运行,需要导入各种依赖和配置,十分繁琐。而Spring Boot 能简化配置、开箱即用、快速集成,主要归功于SpringBoot 的 starter 机制。通过starter,我们能够快速的引入一个功能组件。本文将对 stater 进行介绍。
1 starter概述
starter会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦。
starter中使用ConfigurationProperties来保存配置,这些配置都可以有默认值,帮助用户减少了无谓的配置操作。同时starter一般会预留自定配置选项,只需要在application.properties中设置相关参数,就可以实现配置的个性话。
这里简单介绍下starter实现自动化配置的流程。
引入starter依赖后,spring-boot启动的时候会找到starter jar包中的resources/META-INF/spring.factories文件,根据spring.factories文件中的配置,找到需要自动配置的类
2 Starter创建和使用步骤
2.1 starter创建
创建一个starter项目
创建一个ConfigurationProperties,用于保存配置信息
创建一个AutoConfiguration(Configuration)
AutoConfiguration中实现所有starter应该完成的操作;
AutoConfiguration 并且把这个类加入spring.factories配置文件中进行声明配置spring.factories
把AutoConfiguration类加入spring.factories配置文件中进行声明。通过该配置,才能SpringBoot来自动加载AutoConfiguration类。打包项目
2.2 starter使用
在项目里使用starter非常简单:
- 引入starter依赖
- 添加配置(如果需要的话)
- 注入需要的service
3 实现一个Spring Boot Starter项目
3.1 创建Starter项目
SpringBoot系列定义jar包的名称是:
spring-boot-starter-xxx.jar
而自己的项目定义的jar通常是:
xxx-spring-boot-starter.jar
这里我们创建一个husky-spring-boot-starter项目,pom主要如下
<groupId>com.dc.husky</groupId>
<artifactId>husky-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
3.2 创建ConfigurationProperties
ConfigurationProperties用于保存配置信息:
@ConfigurationProperties(prefix = "husky")
@Getter
@Setter
public class HuskyProperties {
private String character;
}
3.3 创建AutoConfiguration
@Configuration
@EnableConfigurationProperties(HuskyProperties.class)
public class HuskyAutoConfiguration {
@Bean
public Husky husky(HuskyProperties properties){
Husky husky = new Husky(properties.getCharacter());
return husky;
}
}
HuskyAutoConfiguration 主要的业务功能定义Husky如下
public class Husky {
private String character;
private String name = "husky";
public Husky(String character) {
this.character = character;
}
public void tellSecret(){
if ("lovely".equals(character)){
System.out.println("Congratulation! You have a lovely husky.");
} else {
System.out.println("What a pity! You have a naughty husky.");
}
}
}
3.4 配置spring.factories
在resources/META-INF/下创建spring.factories文件,并添加下列配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.dc.husky.starter.HuskyAutoConfiguration
3.4 打包项目,生成jar包
3.5 使用spring-boot-starter
maven引入husky-spring-boot-starter的jar包
<dependency>
<groupId>com.dc.husky</groupId>
<artifactId>husky-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
在 resources/application.properties文件添加自定义的配置
husky.character=lovely
测试输出
@SpringBootTest
@Slf4j
class ApplicationTests {
@Autowired
private Husky husky;
@Test
void test() {
husky.tellSecret();
}
}
输出结果如下
2022-10-15 19:21:57.115 INFO 90145 --- [main] c.d.a.s.ApplicationTests : Started ApplicationTests in 4.353 seconds (JVM running for 7.676)
Congratulation! Your have a lovely husky.
4 原理
我们引入starter的依赖,会将自动配置的类的jar引入。主要的逻辑如下:
在SpringBoot的启动类会加上@SpringBootApplication注解。这个注解默认会引入@EnableAutoConfiguration注解。
@EnableAutoConfiguration注解使用@Import引入了AutoConfigurationImportSelector类。
AutoConfigurationImportSelector的selectImports方法最终会通过SpringFactoriesLoader.loadFactoryNames加载META-INF/spring.factories文件。
spring.factories包含了所有需要装配的XXXConfiguration类的全限定名。其中就有我们自己定义的HuskyAutoConfiguration。这些configuration类定义的bean根据配置信息进行初始化,并加入到spring到容器中。