学习springboot 的自动配置原理

news2025/3/16 21:35:04

前言

为什么要学习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.coloradmin.cn/o/2316261.html

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

相关文章

排错 -- FISCO BCOS区块链网络 -- 3. 编译智能合约

文章为FISCO BCOS2.0搭建区块链平台中发现的问题与总结&#xff0c;出错原因不唯一 &#xff0c;解决办法不唯一 目前社区缺少完整&#xff0c;稳定的搭建平台和教程 &#xff0c;欢迎各位及时补充&#xff0c;如有错误请及时评论纠正&#xff01; 感谢各位搜索到这里&#…

ffmpeg 添加毫秒时间戳

网上有好多添加时间水印的&#xff0c;默认是到秒&#xff0c;而我需要到毫秒&#xff0c;查了一下&#xff0c;没有找到更好的方案&#xff0c;下面是自己实现的方案&#xff0c;可以显示到毫秒。如果有更好的方案&#xff0c;欢迎讨论 ffmpeg -i video.mp4 -vf "drawte…

centos7上安装Docker

文章目录 **1. 使用华为云镜像源替换Docker仓库****2. 安装Docker CE****3.更换docker镜像源-使用华为云的docker镜像源****4.补充&#xff1a;docker的使用****5.补充&#xff1a;删除docker的步骤** 1. 使用华为云镜像源替换Docker仓库 步骤&#xff1a; 删除无效的Docker仓…

【Linux内核系列】:文件系统收尾以及软硬链接详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 世界上只有一种个人英雄主义&#xff0c;那么就是面对生活的种种失败却依然热爱着生活 内容回顾 那么在之前的学习中&#xff0c;我们…

视频理解之Actionclip(论文宏观解读)

配合解读代码解读 1.研究背景 1. 视频行为识别的重要性 视频行为识别是视频理解领域的核心任务之一&#xff0c;旨在通过分析视频内容来识别和分类其中的人物行为或活动。这一任务在多个领域具有重要的应用价值&#xff0c;例如智能监控、人机交互、自动驾驶、医疗健康等。随…

navicat16 升级到 navicat17 之后原来的连接找不到了 mac用户

版本16的路径 注意把对应的路径改成自己的用户名 /Users/自己的用户名/Library/Application Support/PremiumSoft CyberTech/Navicat CC/Common/Settings 版本17的路径 /Users/自己的用户名/Library/Containers/com.navicat.NavicatPremium/Data/Library/Application Suppor…

Altium Designer——CHIP类元器件PCB封装绘制

文章目录 PCB封装组成元素&#xff1a;焊盘的属性 SS34肖特基二极管SMA(DO-214AC)封装绘制资料&#xff1a;步骤&#xff1a;1.绘制焊盘&#xff1a;用到的快捷键&#xff1a;资料&#xff1a; 2.绘制丝印&#xff1a;用到的快捷键&#xff1a;资料&#xff1a; PCB封装组成元素…

【一起来学kubernetes】12、k8s中的Endpoint详解

一、Endpoint的定义与作用二、Endpoint的创建与管理三、Endpoint的查看与组成四、EndpointSlice五、Endpoint的使用场景六、Endpoint与Service的关系1、定义与功能2、创建与管理3、关系与交互4、使用场景与特点 七、Endpoint的kubectl命令1. 查看Endpoint2. 创建Endpoint3. 编辑…

《AI浪潮中的璀璨新星:Meta Llama、Ollama与DeepSeek的深度剖析》:此文为AI自动生成

《AI浪潮中的璀璨新星&#xff1a;Meta Llama、Ollama与DeepSeek的深度剖析》&#xff1a;此文为AI自动生成 引言&#xff1a;AI 大模型的群雄逐鹿时代 在科技飞速发展的当下&#xff0c;AI 大模型领域已成为全球瞩目的焦点&#xff0c;竞争激烈程度堪称白热化。从 OpenAI 推出…

LVGL移植到6818开发板

一、移植步骤 1.lv_config.h 配置文件启动 framebuffer 2、lv_config.h 配置文件关闭SDL 2.修改main.c 去掉SDL输入设备 3.修改Makefile 文件启动交叉编译 去掉警告参数 去掉SDL库 4.交叉编译代码 make clean #清空 ⭐ 必须要清空一次再编译&#xff01; 因为修改了 lv_con…

UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法

有些差异 这么牛逼的引擎&#xff0c;居然有这种入门级别的问题&#xff0c;一触发清理&#xff0c;大概率(80%)会崩溃 无论虚幻5还是UE4都有这个问题&#xff0c;挺烦人的 实在忍不了了&#xff0c;这次&#xff0c;今天 就想问问有什么好的处理方法么&#xff1f;&#x…

(全)2024下半年真题 系统架构设计师 综合知识 答案解析01

系统架构设计师第二版教程VIP课程https://edu.csdn.net/course/detail/40283 操作系统 下列选项中不能作为预防死锁措施的是 。 A. 破坏“循环等待"条件 B. 破坏“不可抢占”条件 C. 破坏“互斥”条件 D. 破坏“请求和保持”条件 答案&#xff1a;C 解析&…

Linux系统之less命令的基本使用

Linux系统之less命令的基本使用 一、less命令介绍二、less命令的使用帮助2.1 less命令的帮助信息2.2 less命令主要选项解释 三、less命令的基本使用3.1 查看文件内容3.2 结合管道使用 四、注意事项 一、less命令介绍 在Linux和Unix类操作系统中&#xff0c;文件浏览是一项常见的…

【微知】plantuml在泳道图中如何将多个泳道框起来分组并且设置颜色?(box “浏览器“ #LightGreen endbox)

泳道分组并且着色 分组用 box和endbox &#xff0c;颜色用#xxx&#xff0c;标注用"xxx" box "浏览器" #LightGreen participant "浏览器1" as Browser participant "浏览器2" as Browser2 endboxparticipant "服务端" as …

C#生产型企业ERP系统管理软件PCB行业ERP进销存MRP管理系统BOM管理

背景 本软件为为苏州某生产型电子科技企业开发的ERP管理软件。 功能说明 希哲管理系统v1.0是一款在流览器上使用的企业管理软件&#xff0c;使用上与客户端版的优势是&#xff1a; 1.安装更新部署方便&#xff0c;只需服务器部署了软件&#xff0c;其它客户端的用户无需安装&am…

文件系统 linux ─── 第19课

前面博客讲解的是内存级文件管理,接下来介绍磁盘级文件管理 文件系统分为两部分 内存级文件系统 : OS加载进程 ,进程打开文件, OS为文件创建struct file 和文件描述符表 ,将进程与打开的文件相连, struct file 内还函数有指针表, 屏蔽了底层操作的差异,struct file中还有内核级…

射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用

射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用 一、FEM是什么? 射频前端模块(Front-End Module, FEM)是无线通信系统中负责处理射频信号的核心组件。它将多个关键电路集成在一个模块中,包括功率放大器(PA)、低噪声放大器(LNA)、射频开关(Switch)、…

qemu分析之 KVM_EXIT_MMIO

基于qemu-2.8.1 address_space_rw 函数作用 这是QEMU内存子系统的核心函数&#xff0c;负责分块处理跨MemoryRegion的内存读取操作。主要场景包括&#xff1a; 处理跨越多个MemoryRegion的连续内存读取区分RAM直接访问与MMIO设备模拟处理不同位宽&#xff08;1/2/4/8字节&am…

OSI 七层网络模型

文章目录 OSI 七层模型应用层表示层会话层传输层网络层数据链路层物理层 TCP/IP 四层模型应用层传输层网络层数据链路层 TCP/IP 特点OSI 和 TCP/IP 两者关系通信过程及相关协议常用协议及端口号常用协议分类参考链接 OSI 七层模型 七层模型&#xff0c;亦称OSI&#xff08;Ope…

虚拟电商-数据库分库分表(二)

本文章介绍&#xff1a;使用Sharding-JDBC实现数据库分库分表&#xff0c;数据库分片策略&#xff0c;实现数据库按月分表 一、Sharding-JDBC使用 1.1.准备环境 步骤一&#xff1a;分库分表sql脚本导入 创建了两个数据库&#xff1a;chongba_schedule0 和chongba_schedule1…