当前位置: 首页 > news >正文

国家电网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 应用的配置工作。

http://www.cnnetsun.cn/news/181074.html

相关文章:

  • 网络安全核心基础百问百答:你的第一本实用安全速查手册
  • 揭秘Open-AutoGLM如何拯救非遗文化:5大核心技术首次公开
  • 揭秘Open-AutoGLM底层架构:如何实现高质量文创内容自动生成
  • 收藏!大模型学习实战指南:从入门到进阶,小白/程序员少走90%弯路
  • 收藏!2025年AI行业风口:应用层人才成企业争抢核心,程序员/小白入门指南
  • 你不知道的Open-AutoGLM黑科技(5个隐藏功能让城市管理效率提升300%)
  • 传奇手游快速挂机 巨 椰 云手机
  • AbMole小课堂:类器官培养中决定成败的抑制剂、细胞因子
  • Vue基础入门08,详解 Vue watch 侦听器:基础用法、深度监听与立即执行场景
  • 怎样选择品牌代工厂?不要只关注价格,这5点才是关键
  • 一键群控多台电脑,狂揽 2.2 万 GitHub Star!
  • Open-AutoGLM模型压缩技术揭秘:在边缘设备上实现毫秒级推理的6种方法
  • Open-AutoGLM部署避坑指南,20年架构师亲授高可用场景适配秘诀
  • 为什么说Open-AutoGLM是首个真正具备自主学习能力的开源框架?
  • 一篇文章熟悉Java打包到部署
  • 数据结构 —— 顺序表
  • 基于springboot的大创管理系统(11549)
  • springboot基于安卓的老年养护与智能服务系统
  • EasyGBS助力智慧医院打造全方位视频监控联网服务体系
  • 【收藏级】全面拆解GraphRAG:从原理到实践,大模型知识库升级必备
  • Java多态——Java的三大特性之一,零基础小白到精通,收藏这篇就够了
  • 【Open-AutoGLM元宇宙适配终极指南】:揭秘三大核心技术突破与落地实践
  • Open-AutoGLM如何实现自主学习?:深度剖析其进化机制与训练闭环设计
  • [驱动之路——GPIO子系统]学习总结,万字长篇,一文彻底搞懂GPIO子系统(含GPIO控制器驱动框架解析)
  • Open-AutoGLM如何重塑城市治理?:3个真实案例揭示AI协同调度的颠覆性力量
  • 智能体式AI实战指南:从零构建IT自动化系统,程序员必学收藏教程
  • 家长用Realme手机,怎样远程管理孩子iPhone的屏幕使用时长?
  • 【Open-AutoGLM智慧城市协同调度】:揭秘未来城市交通智能调度的5大核心技术
  • Java SpringBoot+Vue3+MyBatis 宠物爱心组织管理系统系统源码|前后端分离+MySQL数据库
  • 【Open-AutoGLM自动驾驶交互核心技术】:揭秘AI驱动的车载人机协同新范式