news 2026/1/30 5:21:32

国家电网Java面试被问:Spring Boot Starter 制作原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
国家电网Java面试被问:Spring Boot Starter 制作原理

Spring Boot Starter 制作原理

Spring Boot Starter 是 Spring Boot 的核心特性之一,它通过自动配置简化了依赖管理和配置。下面详细解释其制作原理:

一、核心概念

1.Starter 的本质

  • 依赖集合包:Starter 本身是一个空的 JAR 文件,只包含pom.xml,用于聚合相关依赖

  • 自动配置类:通过spring.factoriesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件提供自动配置类

  • 配置属性类:定义可通过application.propertiesapplication.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(); } }

六、工作原理总结

  1. 启动时扫描:Spring Boot 启动时扫描所有META-INF/spring.factoriesAutoConfiguration.imports文件

  2. 加载配置类:读取并加载所有自动配置类

  3. 条件评估:根据条件注解判断是否启用配置

  4. 创建 Bean:满足条件时,自动配置类中的@Bean方法被执行

  5. 属性绑定@ConfigurationProperties将配置文件中的属性绑定到 Bean

通过这种机制,Starter 能够智能地根据项目环境和配置,自动装配所需的组件,大大简化了 Spring 应用的配置工作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/24 12:06:12

网络安全核心基础百问百答:你的第一本实用安全速查手册

当我们学习网络安全的时候&#xff0c;需要对它的基础知识做一个简单的了解&#xff0c;这样对以后的学习和工作都会有很大的帮助。本篇文章为大家总结了网络安全基础知识入门的内容&#xff0c;快跟着小编来学习吧。 计算机网络 计算机网络是利用通信线路将不同地理位置、具…

作者头像 李华
网站建设 2026/1/20 0:08:22

揭秘Open-AutoGLM如何拯救非遗文化:5大核心技术首次公开

第一章&#xff1a;揭秘Open-AutoGLM如何拯救非遗文化在数字化浪潮席卷全球的今天&#xff0c;许多濒临失传的非物质文化遗产正借助前沿AI技术重获新生。Open-AutoGLM作为一款开源的自动化生成语言模型框架&#xff0c;凭借其强大的多模态理解与生成能力&#xff0c;正在成为非…

作者头像 李华
网站建设 2026/1/30 9:46:34

揭秘Open-AutoGLM底层架构:如何实现高质量文创内容自动生成

第一章&#xff1a;揭秘Open-AutoGLM底层架构&#xff1a;如何实现高质量文创内容自动生成Open-AutoGLM 是基于 GLM 架构演进而来的开源自动内容生成模型&#xff0c;专为文化创意产业设计&#xff0c;具备强大的语义理解与多模态内容生成能力。其核心在于融合了大规模预训练语…

作者头像 李华
网站建设 2026/1/28 1:27:39

收藏!大模型学习实战指南:从入门到进阶,小白/程序员少走90%弯路

大模型浪潮席卷而来&#xff0c;越来越多的人想跻身这个高薪赛道&#xff0c;但学习路上的迷茫和挫败感&#xff0c;成了很多人的“拦路虎”。我的后台每天都能收到大量类似的求助&#xff1a; “零基础想学家用大模型&#xff0c;不知道从哪开始&#xff0c;怕学不会又怕学错&…

作者头像 李华
网站建设 2026/1/23 16:58:09

你不知道的Open-AutoGLM黑科技(5个隐藏功能让城市管理效率提升300%)

第一章&#xff1a;Open-AutoGLM 智慧城市协同调度在现代智慧城市建设中&#xff0c;交通、能源与公共安全等多系统间的高效协同成为提升城市运行效率的核心挑战。Open-AutoGLM 作为一种基于大语言模型的自动化决策引擎&#xff0c;能够理解复杂城市语义环境&#xff0c;并生成…

作者头像 李华