学习springboot 的自动配置原理

ops/2025/3/20 2:39:44/

前言

为什么要学习springboot 的自动配置原理?

1学习 自定义成starter 的前提

  • 实际开发中,我们如果定义公共的组件给团队使用,为了让他们使用方便就自定义成starter。而想要学习starter ,就要先了解springboot 的自动配置原理

2 面试需要

  • 了解自动配置的实现过程

了解 springboot 的自动配置

自动配置的含义

遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器

观点:之前的博客说:程序引入spring-boot-starter-web起步依赖,启动后,会自动往ioc容器中注入DispatcherServlet 对象

demo(案例:验证上面的观点)

  • 注释掉web的起步依赖,发现无法从ioc 容器中获得


验证:当引入web启动依赖,将DispatcherServlet 注入到ioc 容器中的

  • 接下来,通过源码分析,当程序引入spring-boot-starter-web起步依赖,是如何将DispatcherServlet 注入到ioc 容器中的。

起点:启动类的@SpringBootApplication。

  • 按ctril+B 进入该注解的底层往下扒


进入@SpringBootApplication 的内部看到 


进入@EableAutoConfiguration 注解

  • 看到import注解,我们指定该注解有两者形式

1 导入配置类

2 导入实现ImportSelect 接口的实现类


进入到 AutoConfigurationImportSelector 类,看到重写的 selectImports方法

我们知道该方法返回的String 数组,存储的是配置文件读取的配置类的权限定类名【类的包名+类名形式


进入 getAutoConfigurationEntry 方法,看到getCandidateConfigurations方法

进入该方法,可以看到 调用 load方法 使用类加载器,实现对.import配置文件的解析

鼠标放在类加载器上【getBeanClassLoader】可以看到加载的是 外部库中autoConfiguration 


看到 pom文件的spring boot 核心起步依赖【一般情况下,都会有】

<!--        springboot核心的起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>

点进去,可以看到  spring-boot-autoconfigure 依赖

因此我们可以在外部库中,看到spring-boot-autoconfigure 依赖


进入.import配置文件

注意:在.import配置文件中都是自动配置类


ctril+f 搜索  DispatcherServleAutoConfiguration,看到 DispatcherServleAutoConfiguration,ctril+b 进入

进入 DispatcherServleAutoConfiguration

  • @ConditionalOnClass 注解

样图

看到 @ConditionalOnClass({DispatcherServlet.class})

含义:如果 当前环境下,存在 DispatcherServlet类,自动配置类就会使用本类中dispatcherServlet方法,并通过@Bean 注解,将 DispatcherServlet对象,自动注入到 ioc容器中

  • 使用@Bean 注解,将 DispatcherServlet注入ioc 容器


问题

怎么知道当前环境下,存在 DispatcherServlet类?

:web起步依赖如果存在,则就有DispatcherServlet类

总结:当程序引入spring-boot-starter-web起步依赖,自动将DispatcherServlet 注入到ioc 容器中的


之前我们都是手动书写配置类,现在学习自动配置以后应该做什么改变?

答:

之前 的博客:学习 springboot -Bean 管理(注册条件)-CSDN博客

关于@ConditionalOnClass 注解 的CommonConfig 配置类

我们都是手动提供 配置类和在启动类使用import注解导入配置类,这样很显然是不符合自动配置的

因此如果要实现自动配置,配置类不应该由我们提供,而是谁提供bean 对象,就有谁提供配置类--- 引入的外部 jar 包【依赖】


存储自动配置类的全类名【包名+类名形式】在spring-boot-autoconfigure-3.4.3.jar 的哪一个配置文件下?

答:

由于springboot版本的迭代,最早是在spring.factories 配置文件下

现在是在.import配置文件下

demo(案例)

注意:这个案例可以和 学习springboot-Bean管理(Bean 注册,Bean 扫描)_spring boot 扫描注解-CSDN博客

Bean注册的demo(案例)进行对比


目的:在springboot项目引入第三方jar包,打印获取 jar包中的province 对象


项目准备

1 使用黑马教学的第三方jar包:common-pojo-2.0.jar

 通过网盘分享的文件:03_自动配置.rar
链接: https://pan.baidu.com/s/1IJqFt-Ma8ZEAqX7HoaJ-jg 提取码: xxfq

2 解压 文件

3 打开 本地仓库文件 修改jar包的所在路径

  • 我已经修改好了

4 复制上面的命令,打开命令行在确保maven 环境配置好的情况下,运行该命令

  • 把这个jar 包下载到本地仓库
  • 我已经在命令行运行成功

5 打开自己的本地仓库,可以看到 已经下好的jar包

6 打开IDEA 构建springboot 项目,在pom 文件添加已经下载的jar包坐标,最好加载成功

<!--common-pojo 依赖--><dependency><groupId>cn.itcast</groupId><artifactId>common-pojo</artifactId><version>2.0</version></dependency>

7 打开外部库,就可以看到 common-pojo-2.0.jar

正文

打开 springboot项目【web起步依赖等】

运行截图如下

发现:没有书写任何的配置类,并且成功打印了jar包中的Province对象信息


下一篇博客介绍:自定义starter


http://www.ppmy.cn/ops/167175.html

相关文章

FastJson:JSON JSONObject JSONArray详解以及SimplePropertyPreFilter 的介绍

FastJson&#xff1a;JSON JSONObject JSONArray详解以及SimplePropertyPreFilter 的介绍 FastJson是阿里巴巴开发的一款专门用于Java开发的包&#xff0c;实现Json对象&#xff0c;JavaBean对&#xff0c;Json字符串之间的转换。 文章目录 FastJson&#xff1a;JSON JSONObje…

C#运算符与表达式:从入门到游戏伤害计算实践

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

【为什么游戏能使人上瘾】

为什么游戏能使人上瘾&#xff0c;而工作不会&#xff1f;——从神经科学、心理学与行为设计学拆解 一、多巴胺回路的“即时收割” vs “延迟满足” 游戏的神经劫持机制 即时反馈闭环&#xff1a;游戏设计遵循“行为→奖励→强化”的秒级循环。例如&#xff1a; • 击杀小怪→金…

链表·简单归并

cur->next la; //将 p指针所指向的链表节点的 next 指针&#xff08;也就是 p 节点的下一个节点的指针&#xff09;指向 l1 所指向的链表节点。简单来说&#xff0c;就是把 la 节点连接到 p 节点的后面&#xff0c;更新了链表的连接关系。 p la; //将p指针的值更新为 la …

【服务器】RAID0、RAID1、RAID5、RAID6、RAID10异同与应用

目录 ​编辑 一、RAID概述 1.1 磁盘阵列简介 1.2 功能 二、RAID级别 2.1 RAID 0&#xff08;不含校验与冗余的条带存储&#xff09; 2.2 RAID1&#xff08;不含校验的镜像存储&#xff09; 2.3 RAID 5 &#xff08;数据块级别的分布式校验条带存储&#xff09; 4、RAI…

Java+AI:传统编程语言的智能化突围之路

一、Java的坚守与突围&#xff1a;AI时代的双重挑战 作为企业级开发的“常青树”&#xff0c;Java在过去的25年里构建了庞大的生态帝国。然而&#xff0c;AI时代的到来让Python、R等语言在机器学习领域占据主导地位&#xff0c;Java开发者正面临严峻的转型压力。但数据显示&am…

如何打造安全稳定的亚马逊采购测评自养号下单系统?

在当今的电商领域&#xff0c;亚马逊作为全球领先的在线购物平台&#xff0c;其商品种类繁多&#xff0c;用户基数庞大&#xff0c;成为了众多商家和消费者的首选。而对于一些需要进行商品测评或市场调研的用户来说&#xff0c;拥有一个稳定、安全的亚马逊账号体系显得尤为重要…

Python F-String 深度解析:原理、用法与最佳实践

# Python F-String 深度解析&#xff1a;原理、用法与最佳实践 ## 一、引言 Python 的 F-String&#xff08;格式化字符串字面值&#xff09;自 3.6 版本引入以来&#xff0c;凭借其简洁性和高效性&#xff0c;迅速成为字符串格式化的首选方案。本文将从原理、核心用法和编码规…