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

SpringBoot的依赖管理和自动配置

与其明天开始,不如现在行动!

文章目录

    • 1 依赖管理机制
    • 2 自动配置机制
      • 2.1 初步理解
      • 2.2 完整流程
  • 💎总结


1 依赖管理机制

  1. 为什么导入starter-web后所有相关依赖都会导入进来?

    1. 开发什么场景,导入什么场景启动器-spring-boot-starter-
    2. maven依赖传递原则,a-b-c:a就拥有c
    3. 导入一个场景启动器,就会自动把整个场景的所有核心依赖全部导入进来
  2. 为什么版本号都不用写?

    1. 每个boot项目都有一个父项目:spring-boot-starter-parent

    2. parent的父项目是:spring-boot-dependencies

    3. 在里面版本仲裁中心就写好了每个jar包的版本

    4. 要自定义版本号

      1. 直接在依赖下面声明版本号
      2. 利用maven的就近原则
        • 直接在当前项目使用<properties>标签
      <properties><mysql.version>8.0.31</mysql.version>
      </properties>
      
    5. 第三方jar包要自己声明

image-20231206142937666

2 自动配置机制

2.1 初步理解

  1. 自动配置的Tomcat、SpringMVC等
    1. 以前:要配置一堆的组件
    2. 现在:SpringBoot自动配置好这些组件,容器中有了什么组件,就具有什么功能
    3. 导入场景,容器中就会自动配置好这个场景的核心组件
  2. 默认的包扫描规则
    1. @SpringBootApplication注解的类就是主程序
    2. SpringBoot只会扫描主程序所在的包及其下面的子包:com.wen.usercenter及其子包
  3. 配置默认值
    1. 配置文件(如:application.properties)的所有配置项是和某个类的对象值进行一一绑定的
    2. 绑定了配置文件中每一项值的类:配置属性类
  4. 按需加载自动配置
    1. 导入场景spring-boot-starter-web
    2. 场景启动器除了会导入相关依赖,还导入一个spring-boot-starter,是所有starterstarter,基础核心starter
    3. spring-boot-starter导入了一个包spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration自动配置类
    4. 虽然全场景的自动配置都在spring-boot-autoconfigure这个包,但是不是全部开启的。导入哪个场景就开启哪个。

总结:导入场景启动器,触发spring-boot-autoconfigure这个包的自动配置生效,容器中就会具有相关的功能

2.2 完整流程

思考:

  1. SpringBoot怎么实现导入一个starter,写一些简单的配置,应用就能跑起来,我们无需关心整合?
  2. 为什么Tomcat的端口号可以配置在application.properties中,并且Tomcat能启动成功?
  3. 导入场景后哪些自动配置能生效?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

流程:

  1. 导入stater:导入了web开发场景
    1. 场景启动器导入了相关场景的所有依赖:starter-jsonstarter-tomcatspringmvc
    2. 每个场景启动器都引入了一个spring-boot-starter核心场景启动器
    3. 核心场景启动器引入了spring-boot-autoconfigure自动配置包,里面囊括了所有场景的所有配置
    4. 只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了
    5. SpringBoot默认扫描不到spring-boot-autoconfigure下写好的所有配置类
  2. 主程序:@SpringBootApplication
    1. @SpringBootApplication由三个注解组成:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
    2. SpringBoot默认扫描不到spring-boot-autoconfigure下写好的所有配置类
    3. @EnableAutoConfiguration:SpringBoot开启自动配置的核心。
      1. 是由@Import({AutoConfigurationImportSelector.class})提供功能:批量给容器中导入组件
      2. SpringBoot启动会默认加载142个配置类
      3. 这142个配置类来自于spring-boot-autoconfigure包下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的所有类
      4. 项目启动的时候利用@Import批量导入组件机制把autoconfigure包下的142个xxxAutoConfiguration类导入进来(自动配置类)
      5. 按需生效:
        1. 虽然导入了142个自动配置类,但是并不是都能生效
        2. 每个自动配置类,都有条件注解@ConditionOnXxx,只有条件成立,才能生效
      6. xxxAutoConfiguration自动配置类
        1. 给容器中使用@Bean放一堆组件
        2. 每个自动配置类都有可能由注解:@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中配的指定前缀的属性值封装到xxxProperties属性类
        3. 以Tomcat为例,把服务器的所有配置都是以server开头的。配置都封装到属性类中
        4. 给容器中放的所有组件的一些核心参数,都来自于xxxPropertiesxxxProperties都适合配置文件绑定的
        5. 只需要改配置文件的值,核心组件的底层参数都能修改
  3. 写业务,无需关心各种整合(底层这些整合都写好了,而且也生效了)

核心流程:

  1. 导入starter,就会导入autoconfigure
  2. autoconfigure包里面有一个文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定了所有启动要加载的自动配置类
  3. @EnableAutoConfiguration会自动的把上面文件里面写的所有自动配置类都导入进来。
  4. xxxAutoConfiguration给容器中导入很多组件,根据条件注解按需加载 ,组件都是从xxxProperties中提取属性值
  5. xxxProperties又是和配置文件进行绑定

效果:导入starter、修i该配置文件、就能修改底层行为


💎总结

本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!


相关文章:

SpringBoot的依赖管理和自动配置

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 依赖管理机制2 自动配置机制2.1 初步理解2.2 完整流程 &#x1f48e;总结 1 依赖管理机制 为什么导入starter-web后所有相关依赖都会导入进来&#xff1f; 开发什么场景&#xff0c;导入什么场景启动器-spring-bo…...

linux 定时任务

使用 crontab Usage: crontab [-u user] [-e|-l|-r] Crontab 的格式说明如下: * 逗号(‘,’) 指定列表值。如: “1,3,4,7,8″ * 中横线(‘-’) 指定范围值 如 “1-6″, 代表 “1,2,3,4,5,6″ * 星号 (‘*’) 代表所有可能的值 */15 表示每 15 分钟执行一次 # Use the ha…...

增强现实中的真实人/机/环与虚拟人/机/环

在增强现实中&#xff0c;真实人与虚拟人、真实机器与虚拟机器、真实环境与虚拟环境之间有着密切的关系。增强现实技术通过将真实与虚拟相结合&#xff0c;打破了传统的现实世界与虚拟世界的界限&#xff0c;创造出了一种新的体验方式。真实人、真实机器和真实环境与其对应的虚…...

Python网络爬虫环境的安装指南

网络爬虫是一种自动化的网页数据抓取技术&#xff0c;广泛用于数据挖掘、信息搜集和互联网研究等领域。Python作为一种强大的编程语言&#xff0c;拥有丰富的库支持网络爬虫的开发。本文将为你详细介绍如何在你的计算机上安装Python网络爬虫环境。 一、安装python开发环境 进…...

【MyBatis系列】MyBatis字符串问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【Java】构建表达式二叉树和表达式二叉树求值

问题背景 1. 实现一个简单的计算器。通过键盘输入一个包含圆括号、加减乘除等符号组成的算术表达式字符串&#xff0c;输出该算术表达式的值。要求&#xff1a; &#xff08;1&#xff09;系统至少能实现加、减、乘、除等运算&#xff1b; &#xff08;2&#xff09;利用二叉…...

采用Python 将PDF文件按照页码进行切分并保存

工作中经常会遇到 需要将一个大的PDF文件 进行切分&#xff0c;比如仅需要大PDF文件的某几页 或者连续几页&#xff0c;一开始都是用会员版本的WPS&#xff0c;但是对于程序员&#xff0c;就是要采用技术白嫖 这里就介绍一个 python的PDF 包 PyPDF2 其安装方式也很简单 p…...

H264视频编码原理

说到视频&#xff0c;我们首先想到的可能就是占内存。我们知道一个视频是由一连串图像序列组成的&#xff0c;视频中图像一般是 YUV 格式。假设有一个电影视频&#xff0c;分辨率是 1080P&#xff0c;帧率是 25fps&#xff0c;并且时长是 2 小时&#xff0c;如果不做视频压缩的…...

UDP实现群聊

代码&#xff1a; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String;public class liaotian extends JFrame{private static final int DEFAULT_PORT8899;private JLabel stateLB…...

服务器部署网易开源TTS | EmotiVoice部署教程

一、环境 ubuntu 20.04 python 3.8 cuda 11.8二、部署 1、docker方式部署 1.1、安装docker 如何安装docker&#xff0c;可以参考这篇文章 1.2、拉取镜像 docker run -dp 127.0.0.1:8501:8501 syq163/emoti-voice:latest2、完整安装 安装python依赖 conda create -n Emo…...

贪心算法和动态规划

目录 一、简介 二、贪心算法案例&#xff1a;活动选择问题 1.原理介绍 三、动态规划案例&#xff1a;背包问题 1.原理介绍 四、贪心算法与动态规划的区别 五、总结 作者其他文章链接 正则表达式-CSDN博客 深入理解HashMap&#xff1a;Java中的键值对存储利器-CSDN博客…...

jsp 设备预约管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 设备预约管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…...

Python:核心知识点整理大全10-笔记

目录 5.4 使用 if 语句处理列表 5.4.1 检查特殊元素 toppings.py 5.4.2 确定列表不是空的 5.4.3 使用多个列表 5.5 设置 if 语句的格式 5.6 小结 第6章 字 典 6.1 一个简单的字典 alien.py 6.2 使用字典 6.2.1 访问字典中的值 6.2.2 添加键—值对 6.2.3 先创建一…...

Hive数据库系列--Hive数据类型/Hive字段类型/Hive类型转换

文章目录 一、Hive数据类型1.1、数值类型1.2、字符类型1.3、日期时间类型1.4、其他类型1.5、集合数据类型1.5.1、Struct举例1.5.2、Array举例1.5.3、Map举例 二、数据类型转换2.1、隐式转换2.2、显示转换 三、字段类型的使用3.1、DECIMAL(precision&#xff0c;scale) 本章主要…...

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…...

(JAVA)-缓冲流

缓冲流能高效的读取数据 缓冲流底层自带了8192的缓冲区提高性能&#xff0c;他在原有的流上进行了包装&#xff0c;加上了缓冲效果 原理&#xff1a; 读入时首先会将内存中缓冲区大小的数据读入缓冲区中&#xff0c;接着下次读取直接从缓冲区中读取数据&#xff0c;当缓冲区…...

Autosar UDS-CAN诊断开发02-1(CAN诊断帧格式类型详解、CANFD诊断帧格式类型详解、15765-2(CANTP层)的意义)

目录 前言 CANTP层&#xff08;15765-2协议&#xff09;存在的意义 CANTP层&#xff08;15765-2协议&#xff09;帧类型详细解读&#xff08;普通CAN格式&#xff09; 四种诊断报文类型 单帧SingleFrame(SF) 首帧&#xff1a;FirstFrame(FF) 流控帧&#xff1a;FlowCont…...

swing快速入门(三)

解答一下上一篇关于留下的关于布局管理器的疑问 上一篇 几种常见的布局管理器 看不懂&#xff1f;看不懂没关系&#xff0c;这篇是概念篇&#xff0c;大概了解一下就行~ 1.FlowLayout&#xff08;流式布局&#xff09;&#xff1a;按照从左到右、从上到下的顺序依次排列组件。…...

Swagger PHP Thinkphp 接口文档

安装 1. 安装依赖 composer require zircote/swagger-php 2. 下载Swagger UI git clone https://github.com/swagger-api/swagger-ui.git 3. 复制下载好的Swagger UI 中的dist目录到public目录中&#xff0c;修改目录名称 cp -rf swagger-ui/dist /home/htdocs/public/ m…...

12.9每日一题(备战蓝桥杯循环结构)

12.9每日一题&#xff08;备战蓝桥杯循环结构&#xff09; 题目 2165: 求平均年龄题目描述输入输出样例输入样例输出来源/分类 题解 2165: 求平均年龄题目 2166: 均值题目描述输入输出样例输入样例输出来源/分类 题解 2166: 均值题目 2167: 求整数的和与均值题目描述输入输出样…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...