Spring Boot Starter 制作原理
Spring Boot Starter 是 Spring Boot 的核心特性之一,它通过自动配置简化了依赖管理和配置。下面详细解释其制作原理:
一、核心概念
1.Starter 的本质
依赖集合包:Starter 本身是一个空的 JAR 文件,只包含
pom.xml,用于聚合相关依赖自动配置类:通过
spring.factories或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件提供自动配置类配置属性类:定义可通过
application.properties或application.yml配置的属性
二、关键组件
1.自动配置原理
java
复制
下载
@Configuration // 声明为配置类 @ConditionalOnClass // 类路径下存在指定类时生效 @ConditionalOnProperty // 配置文件中存在指定属性时生效 @EnableConfigurationProperties // 启用配置属性绑定 @AutoConfigureAfter // 指定自动配置顺序 public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean // 容器中不存在该 Bean 时创建 public MyService myService(MyProperties properties) { return new MyService(properties); } }2.条件注解
Spring Boot 提供了丰富的条件注解:
@ConditionalOnClass:类路径存在指定类@ConditionalOnMissingBean:容器中不存在指定 Bean@ConditionalOnProperty:配置属性匹配条件@ConditionalOnWebApplication:Web 应用环境@ConditionalOnExpression:SpEL 表达式条件
三、制作步骤
1.项目结构
text
复制
下载
my-spring-boot-starter/ ├── src/main/java/ │ └── com/example/ │ ├── MyService.java // 核心服务类 │ ├── MyProperties.java // 配置属性类 │ ├── MyAutoConfiguration.java // 自动配置类 │ └── MyStarterApplication.java // 可选:演示应用 ├── src/main/resources/ │ └── META-INF/ │ ├── spring.factories // 传统方式(Spring Boot 2.6-) │ └── spring/ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports // 新方式(Spring Boot 2.7+) └── pom.xml
2.pom.xml 配置
xml
复制
下载
运行
<?xml version="1.0" encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-spring-boot-starter</artifactId> <version>1.0.0</version> <properties> <spring-boot.version>3.1.0</spring-boot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 必须依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!-- 你的 Starter 需要的依赖 --> <dependency> <groupId>com.example</groupId> <artifactId>my-library</artifactId> <version>1.0.0</version> </dependency> </dependencies> </project>篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案
【点击此处即可/免费获取】
3.配置属性类
java
复制
下载
@ConfigurationProperties(prefix = "my.service") public class MyProperties { private String name = "default"; private int timeout = 5000; private List<String> servers = new ArrayList<>(); // getters and setters }4.自动配置类
java
复制
下载
@Configuration @EnableConfigurationProperties(MyProperties.class) @ConditionalOnClass(MyService.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService(MyProperties properties) { MyService service = new MyService(); service.setName(properties.getName()); service.setTimeout(properties.getTimeout()); return service; } @Bean @ConditionalOnMissingBean @ConditionalOnProperty(prefix = "my.service", name = "enabled", havingValue = "true", matchIfMissing = true) public MyFeature myFeature() { return new MyFeature(); } }5.注册自动配置
Spring Boot 2.7+(推荐)
创建文件:src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
text
复制
下载
com.example.MyAutoConfiguration
Spring Boot 2.6 及之前
创建文件:src/main/resources/META-INF/spring.factories
properties
复制
下载
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfiguration
四、高级特性
1.自定义条件注解
java
复制
下载
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Conditional(OnMyCondition.class) public @interface ConditionalOnMyFeature { String value(); } public class OnMyCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 自定义条件判断逻辑 return true; } }2.配置提示(IDE 支持)
创建additional-spring-configuration-metadata.json:
json
复制
下载
{ "properties": [ { "name": "my.service.name", "type": "java.lang.String", "description": "服务名称", "defaultValue": "default" }, { "name": "my.service.timeout", "type": "java.lang.Integer", "description": "超时时间(毫秒)", "defaultValue": 5000 } ] }3.多模块 Starter
xml
复制
下载
运行
<!-- 父模块 --> <artifactId>my-spring-boot-starter</artifactId> <packaging>pom</packaging> <modules> <module>my-spring-boot-autoconfigure</module> <module>my-spring-boot-starter-core</module> </modules> <!-- 自动配置模块 --> <artifactId>my-spring-boot-autoconfigure</artifactId> <!-- 依赖模块 --> <artifactId>my-spring-boot-starter</artifactId> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>my-spring-boot-autoconfigure</artifactId> </dependency> </dependencies>
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案
【点击此处即可/免费获取】
五、最佳实践
1.命名规范
官方 Starter:
spring-boot-starter-{name}第三方 Starter:
{name}-spring-boot-starter
2.设计原则
按需加载:使用条件注解确保只在合适的环境下生效
默认配置:提供合理的默认值,减少用户配置
外部化配置:所有配置都应支持外部化
向后兼容:版本升级时保持 API 兼容性
3.测试 Starter
java
复制
下载
@SpringBootTest @EnableConfigurationProperties class MyAutoConfigurationTest { @Autowired(required = false) private MyService myService; @Test void testAutoConfiguration() { assertThat(myService).isNotNull(); } }六、工作原理总结
启动时扫描:Spring Boot 启动时扫描所有
META-INF/spring.factories或AutoConfiguration.imports文件加载配置类:读取并加载所有自动配置类
条件评估:根据条件注解判断是否启用配置
创建 Bean:满足条件时,自动配置类中的
@Bean方法被执行属性绑定:
@ConfigurationProperties将配置文件中的属性绑定到 Bean
通过这种机制,Starter 能够智能地根据项目环境和配置,自动装配所需的组件,大大简化了 Spring 应用的配置工作。