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:31:54

网络安全入门知识地图:快速构建你的第一层防御体系(新手不绕路)

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

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

零经验想跳槽转行网络安全,需要准备什么?(详细版)

前言 最近在后台收到了部分私信&#xff0c;大部分都是关于网络安全转行的问题&#xff0c;其中&#xff0c;目前咨询最多的是&#xff1a;觉得现在的工作没有发展空间&#xff0c;替代性强&#xff0c;工资低&#xff0c;想跳槽转行网络安全。其中&#xff0c;大家主要关心的…

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

Open-AutoGLM数字人协同落地难题:3个月实现医院场景规模化部署的秘密

第一章&#xff1a;Open-AutoGLM医疗数字人协同的演进与定位随着人工智能在医疗健康领域的深度渗透&#xff0c;Open-AutoGLM作为新一代开源多模态大模型框架&#xff0c;正推动医疗数字人从单向问答向智能协同诊疗演进。该系统融合自然语言理解、医学知识图谱与临床决策支持能…

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

AI内容生成革命来了,你还在手动写文案?

第一章&#xff1a;AI内容生成革命来了&#xff0c;你还在手动写文案&#xff1f; 人工智能正以前所未有的速度重塑内容创作的生态。从社交媒体文案到技术文档撰写&#xff0c;AI驱动的内容生成工具已经能够以极高的效率输出高质量文本&#xff0c;彻底颠覆传统“逐字敲打”的工…

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

探索生命:潜意识的潜力,为何难以激发?

潜意识是一个我们已经熟悉了的词汇&#xff0c;可是你对潜意识的概念有了解吗&#xff1f;一起来看看。潜意识&#xff0c;目前一般是指那些在正常情况下根本不能变为意识的东西&#xff0c;比如&#xff0c;内心深处被压抑而从无意识到的欲望。正是所谓“冰山理论”&#xff1…

作者头像 李华