Spring Boot自动装配:约定大于配置的魔法解密

#### 一、自动装配的哲学思考

在传统Spring应用中,开发者需要手动配置大量的XML或JavaConfig。Spring Boot通过自动装配机制实现了**约定大于配置**的设计理念,其核心思想可以概括为:

1. **智能预设**:基于类路径检测自动配置
2. **条件装配**:通过`@Conditional`系列注解实现动态决策
3. **渐进增强**:允许开发者自定义配置覆盖默认值

#### 二、自动装配的核心实现原理

##### 2.1 启动类解剖
```java

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}


```
- `@SpringBootApplication`是组合注解,包含:
  - `@SpringBootConfiguration`:标记主配置类
  - `@EnableAutoConfiguration`:启用自动配置
  - `@ComponentScan`:组件扫描

##### 2.2 自动配置触发流程
1. **加载候选配置**:读取所有jar包的`META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`
2. **条件过滤**:通过114+种条件注解筛选有效配置类
3. **Bean注册**:将符合条件的配置类中定义的Bean加入容器

#### 三、源码级实现解析

##### 3.1 自动配置入口

`SpringApplication.run()` → `refreshContext()` → `invokeBeanFactoryPostProcessors()`

关键类:
- `AutoConfigurationImportSelector`:负责加载候选配置
- `ConditionEvaluator`:执行条件判断

##### 3.2 条件判断示例
```java

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {// 根据条件创建不同的DataSource
}


```
常见条件注解:
- `@ConditionalOnClass`:类路径存在指定类时生效
- `@ConditionalOnMissingBean`:容器不存在指定Bean时生效
- `@ConditionalOnProperty`:配置参数匹配时生效

#### 四、自动配置调试技巧

##### 4.1 查看生效配置
```properties
# application.properties
debug=true
```
启动时输出:
```

Positive matches:
-----------------DataSourceAutoConfiguration matched:- @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)Negative matches:
-----------------ActiveMQAutoConfiguration:Did not match:- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)
```

##### 4.2 自定义排除配置
```java

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,SecurityAutoConfiguration.class
})


```

#### 五、自定义Starter开发实战

##### 5.1 创建自动配置类
```java

@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService(MyServiceProperties properties) {return new MyService(properties);}
}


```

##### 5.2 注册配置
```text
# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.MyServiceAutoConfiguration
```

##### 5.3 属性配置支持
```java

@ConfigurationProperties("my.service")
public class MyServiceProperties {private String endpoint;private int timeout = 5000;// getters/setters
}


```

#### 六、自动装配的底层支撑

#####  条件评估决策树
```j

public abstract class SpringBootCondition implements Condition {public final boolean matches(...) {ConditionOutcome outcome = getMatchOutcome(...);return outcome.isMatch();}// 抽象方法由具体条件类实现
}


```

#### 七、最佳实践与避坑指南

1. **配置覆盖策略**
   - 优先使用`application.properties`配置
   - 慎用`@Primary`注解覆盖自动配置Bean

2. **启动优化技巧**
   ```

   // 精确控制自动配置加载@ImportAutoConfiguration({DataSourceAutoConfiguration.class,WebMvcAutoConfiguration.class})


   ```

3. **常见问题排查**
   - 使用`--debug`参数分析配置加载
   - 检查依赖冲突导致的类路径异常
   - 监控`ConditionEvaluationReport`日志

#### 八、设计模式启示

1. **工厂方法模式**:通过`AutoConfigurationImportSelector`实现配置加载
2. **策略模式**:不同的`Condition`实现对应不同判断策略
3. **观察者模式**:`ConfigurationClassPostProcessor`处理配置变化

#### 结语

Spring Boot的自动装配机制如同精密的瑞士手表,将约定优先原则与条件化配置完美结合。理解其实现原理不仅能帮助开发者更好地驾驭框架,更能启发我们设计出具有良好扩展性的系统架构。当你下次启动Spring Boot应用时,不妨想象背后这数百个条件判断如同精密齿轮般协同工作的美妙场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fiddler笔记

文章目录 一、与F12对比二、核心作用三、原理四、配置1.Rules:2.配置证书抓取https包3.设置过滤器4、抓取App包 五、模拟弱网测试六、调试1.线上调试2.断点调试 七、理论1.四要素2.如何定位前后端bug 注 一、与F12对比 相同点: 都可以对http和https请求进行抓包分析…

Python爬虫-猫眼电影的影院数据

前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以猫眼电影为例子,获取猫眼的影院相关数据。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) …

linux笔记:shell中的while、if、for语句

在Udig软件的启动脚本中使用了while循环、if语句、for循环,其他内容基本都是变量的定义,所以尝试弄懂脚本中这三部分内容,了解脚本执行过程。 (1)while循环 while do循环内容如下所示,在循环中还用了expr…

利用分治策略优化快速排序

1. 基本思想 分治快速排序(Quick Sort)是一种基于分治法的排序算法,采用递归的方式将一个数组分割成小的子数组,并通过交换元素来使得每个子数组元素按照特定顺序排列,最终将整个数组排序。 快速排序的基本步骤&#…

从零到一实现微信小程序计划时钟:完整教程

在本教程中,我们将一起实现一个微信小程序——计划时钟。这个小程序的核心功能是帮助用户添加任务、设置任务的时间范围,并且能够删除和查看已添加的任务。通过以下步骤,我们将带你从零开始实现一个具有基本功能的微信小程序计划时钟。 项目…

idea日常报错之UTF-8不可映射的字符

目录 一、UTF-8不可映射的字符的解决 1、出现这种报错的情形 2、具体解决办法 前言: 在我们日常代码编写的时候可能会遇到各式各样的错误,有时候并不是你改动了代码,而是莫名其妙就出现的报错,今天我就遇到一个在maven编译的时候…

人工智能技术-基于长短期记忆(LSTM)网络在交通流量预测中的应用

人工智能技术-基于长短期记忆(LSTM)网络在交通流量预测中的应用 基于人工智能的智能交通管理系统 随着城市化进程的加快,交通问题日益严峻。为了解决交通拥堵、减少交通事故、提高交通管理效率,人工智能(AI&#xff…

HTTP FTP SMTP TELNET 应用协议

1. 标准和非标准的应用协议 标准应用协议: 由标准化组织(如 IETF,Internet Engineering Task Force)制定和维护,具有广泛的通用性和互操作性。这些协议遵循严格的规范和标准,不同的实现之间可以很好地进行…

Matlab离线安装硬件支持包的方法

想安装支持树莓派的包,但是发现通过matlab安装需要续订维护服务 可以通过离线的方式安装。 1. 下载SupportSoftwareDownloader Support Software Downloader - MATLAB & Simulink 登录账号 选择对应的版本 2. 选择要安装的包 3.将下载的包copy到安装目录下 …

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类: 1. 基础视图类 这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。 常用类 APIView: 最基本的视图类,所有其…

MyBatis拦截器终极指南:从原理到企业级实战

在本篇文章中,我们将深入了解如何编写一个 MyBatis 拦截器,并通过一个示例来展示如何在执行数据库操作(如插入或更新)时,自动填充某些字段(例如 createdBy 和 updatedBy)信息。本文将详细讲解拦…

137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…

twisted实现MMORPG 游戏数据库操作封装设计与实现

在设计 MMORPG(大规模多人在线角色扮演游戏)时,数据库系统是游戏架构中至关重要的一部分。数据库不仅承担了游戏中各种数据(如玩家数据、物品数据、游戏世界状态等)的存储和管理任务,还必须高效地支持并发访…

【R语言】聚类分析

聚类分析是一种常用的无监督学习方法,是将所观测的事物或者指标进行分类的一种统计分析方法,其目的是通过辨认在某些特征上相似的事物,并将它们分成各种类别。R语言提供了多种聚类分析的方法和包。 方法优点缺点适用场景K-means计算效率高需…

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南,适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤,还提供了68G多套独立部署视频教程教程,针对不同硬件配置的模型选择建议,以…

Java Spring boot 篇:常用注解

Configuration 作用 Configuration 注解的核心作用是把一个类标记为 Spring 应用上下文里的配置类。配置类就像一个 Java 版的 XML 配置文件,能够在其中定义 Bean 定义和 Bean 之间的依赖关系。当 Spring 容器启动时,会扫描这些配置类,解析其…

在 Ubuntu 20.04 为 Clash Verge AppImage 创建桌面图标教程

在 Ubuntu 20.04 为 AppImage 创建桌面图标教程 一、准备工作 确保你已经下载了 xxxx.AppImage 文件,并且知道它所在的具体路径。同时,你可以准备一个合适的图标文件(.png 格式)用于代表该应用程序,如果没有合适的图…

【复现DeepSeek-R1之Open R1实战】系列6:GRPO源码逐行深度解析(上)

目录 4 GRPO源码分析4.1 数据类 GRPOScriptArguments4.2 系统提示字符串 SYSTEM_PROMPT4.3 奖励函数4.3.1 accuracy_reward函数4.3.2 verify函数4.3.3 format_reward函数 4.4 将数据集格式化为对话形式4.5 初始化GRPO Trainer 【复现DeepSeek-R1之Open R1实战】系列3&#xff1…

【杂谈】加油!!!!

为了在三月底前系统准备Java后端开发的面试和笔试,以下是分阶段的高效学习计划: 一、知识体系构建(第1-2周) 核心基础强化 Java基础(每日1.5小时): 重点掌握:JVM内存模型&#xff0…

python旅游推荐系统+爬虫+可视化(协同过滤算法)

✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术,以实现从网站抓取旅游数据、个性化推荐和直观展…