news 2025/12/25 1:00:42

国家电网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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/22 14:33:15

灾情突袭如何快速响应?,Open-AutoGLM智能调度系统全流程拆解

第一章&#xff1a;灾情突袭如何快速响应&#xff1f;&#xff0c;Open-AutoGLM智能调度系统全流程拆解当突发灾情导致通信中断、资源调配失序时&#xff0c;应急响应的每一秒都至关重要。Open-AutoGLM 智能调度系统通过融合大语言模型与自动化决策引擎&#xff0c;实现从灾情识…

作者头像 李华
网站建设 2025/12/22 14:31:43

网络安全完全入门指南:从零开始的学习路线图,一篇搞定基础

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

作者头像 李华
网站建设 2025/12/22 14:17:16

【Open-AutoGLM应急调度解密】:揭秘AI驱动救灾决策的底层逻辑与实战应用

第一章&#xff1a;Open-AutoGLM应急调度解密Open-AutoGLM 是一种面向大规模图神经网络任务的自动化调度框架&#xff0c;专为动态资源环境下的紧急任务响应而设计。其核心机制融合了图结构感知的任务分解与实时资源预测模型&#xff0c;能够在毫秒级完成计算负载重分配。架构概…

作者头像 李华
网站建设 2025/12/24 4:00:31

为什么顶尖车企都在布局Open-AutoGLM?一文看懂其战略价值

第一章&#xff1a;为什么顶尖车企都在布局Open-AutoGLM&#xff1f;一文看懂其战略价值随着智能汽车进入AI驱动的新阶段&#xff0c;自然语言处理与车载系统的深度融合成为竞争焦点。Open-AutoGLM作为专为汽车场景优化的开源大语言模型&#xff0c;正迅速成为行业基础设施的核…

作者头像 李华
网站建设 2025/12/22 14:12:29

Open-AutoGLM性能提升300%的背后:元宇宙多模态融合技术全揭秘

第一章&#xff1a;Open-AutoGLM性能提升300%的核心驱动力Open-AutoGLM 在大规模语言模型推理优化中实现了高达300%的性能提升&#xff0c;其核心驱动力源于架构层面的深度重构与计算资源的智能调度机制。动态稀疏注意力机制 传统Transformer模型在处理长序列时面临计算复杂度平…

作者头像 李华