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该配置文件、就能修改底层行为


💎总结

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


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ROS2] --- action

1 action介绍 ROS通信机制也会被常常用到——那就是动作。从这个名字上就可以很好理解这个概念的含义&#xff0c;这种通信机制的目的就是便于对机器人某一完整行为的流程进行管理。 1.1 客户端/服务器模型 动作和服务类似&#xff0c;使用的也是客户端和服务器模型&#xf…

zabbix 进阶

zabbix的字段发现机制&#xff1a; zabbix客户端主动和服务端联系&#xff0c;将自己的地址和端口发送服务端实现字段添加监控主机。 客户端是主动一方。 缺点&#xff1a;自定义网段中主机数量太多&#xff0c;登记耗时会很久&#xff0c;而且这个自动发现机制不是很稳定。…

c-语言->数据在内存的存储

系列文章目录 文章目录 系列文章目录前言 前言 目的&#xff1a;学习整数在内存的储存&#xff0c;什么是大小端&#xff0c;浮点数的储存。 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0…

Minio保姆级教程

转载自&#xff1a;www.javaman.cn Minio服务器搭建和整合 1、centos安装minio 1.1、创建安装目录 mkdir -p /home/minio1.2、在线下载minio #进入目录 cd /home/minio #下载 wget https://dl.minio.io/server/minio/release/linux-amd64/minio1.3、minio配置 1.3.1、添加…

基于Springboot的校园失物招领系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园失物招领系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

三、jvm中的对象及引用

一、对象在jvm的创建过程 检查加载-->分配内存-->内存空间初始化-->设置-->对象初始化 1) 检查加载 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查类是否已经被加载、解析和初始化过。 虚拟机遇到一条 new 指令时&#xf…

【Deeplearning4j】小小的了解下深度学习

文章目录 1. 起因2. Deeplearning4j是什么3. 相关基本概念4. Maven依赖5. 跑起来了&#xff0c;小例子&#xff01;6. 鸢尾花分类代码 7. 波士顿房价 回归预测代码 8. 参考资料 1. 起因 其实一直对这些什么深度学习&#xff0c;神经网络很感兴趣&#xff0c;之前也尝试过可能因…

Python实现GUI图片浏览程序

Python实现GUI图片浏览程序 下面程序需要pillow库。pillow是 Python 的第三方图像处理库&#xff0c;需要安装才能实用。pillow是PIL&#xff08; Python Imaging Library&#xff09;基础上发展起来的&#xff0c;需要注意的是pillow库安装用pip install pillow&#xff0c;导…

javaEE -14(10000字 JavaScript入门 - 1)

一&#xff1a;初始 JavaScript JavaScript (简称 JS)是世界上最流行的编程语言之一&#xff0c;它是一个脚本语言, 通过解释器运&#xff0c;主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行. JavaScript 和 HTML 和 CSS 之间的关系&#xff1a; HTML…

Rellax.js,一款超酷的 JavaScript 滚动效果库

嗨&#xff0c;大家好&#xff0c;欢迎来到猿镇&#xff0c;我是镇长&#xff0c;lee。 又到了和大家见面的时间&#xff0c;今天和大家分享一款轻松实现视差滚动效果的 JavaScript 库——Rellax.js。无需大量的配置&#xff0c;即可为你的网站增色不少。 什么是Rellax.js&am…

simulinkveristandlabview联合仿真环境搭建

目录 开篇废话 软件版本 明确需求 软件安装 matlab2020a veristand2020 R4 VS2017 VS2010 软件安装验证 软件资源分享 开篇废话 推免之后接到的第一个让人难绷的活&#xff0c;网上开源的软件资料和成功的案例很少&#xff0c;查来查去就那么几篇&#xff0c;而且版本…

以pycharm为例,生成Python项目所需要的依赖库/包文档:requirements.txt

平时我们在编写或者使用别人的Python项目时&#xff0c;往往会看到一个文档requirements.txt&#xff0c;该文档是描述一个Python项目中的第三方库的名称以及版本。本文介绍导出python当前项目依赖包requirements.txt的操作步骤。 方法一&#xff1a;如果每个项目有对应的虚拟…

Java零基础——Elasticsearch篇

1.Elasticsearch简介 Elasticsearch是一个基于Lucene的一个开源的分布式、RESTful 风格的搜索和数据分析引擎。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elasticsearch用于云计算中&#xf…

13. MySQL 日志

目录 错误日志 binlog日志 概述 日志格式 查询日志 慢查询日志 错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当mysqld启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#…

用Rust刷LeetCode之26 删除有序数组中的重复项

26. 删除排序数组中的重复项[1] 难度: 简单 老的描述: 新的描述: 注意是 排序数组,非严格递增排列,即已经是排好序的,只不过有重复元素 func removeDuplicates(nums []int) int { if len(nums) 0 { return 0 } i : 0 for j : 1; j < len(nums); j { …

Kubernetes架构及核心部件

文章目录 1、Kubernetes集群概述1.1、概述1.2、通过声明式API即可 2、Kubernetes 集群架构2.1、Master 组件2.1.1、API Server2.1.2、集群状态存储2.1.3、控制器管理器2.1.4、调度器 2.2、Worker Node 组件2.2.1、kubelet2.2.2、容器运行时环境2.2.3、kube-proxy 2.3、图解架构…

AI隆重软件,AI原创文章隆重软件

随着信息量的急剧增加&#xff0c;许多写作者、网站管理员和内容创作者们纷纷感受到了文章降重的压力。原始文本的降重&#xff0c;需要保留关键信息的同时避免重复&#xff0c;这是一项既繁琐又耗时的任务。 改写软件的批量降重功能 147SEO改写软件在降重领域的卓越表现主要体…

PHP基础 - 注释变量

一. 语言开始标识 在PHP中,文件的开头需要使用语言开始标识来指定该文件是PHP代码。标识通常为"<?php",也可以是"<?",但建议使用"<?php"以确保代码的兼容性和可读性。 <?php // PHP代码从这里开始写 二. PHP注释 注释是用…

svn使用步骤

服务器端主要用来创建仓库&#xff0c;然后供客户端去访问与下载。 客户端&#xff1a; 图形化界面的使用&#xff1a;这里使用的是tortoise工具 1.创建一个文件夹作为自己的本地仓库目录 2.鼠标右键文件夹&#xff0c;在菜单中点击SVN checkout 3.找个图 这一步骤相当于git中…

nodejs+vue+微信小程序+python+PHP的基于大数据的家电销售分析系统设计与实现-计算机毕业设计推荐django

系统按照用户的实际需求开发而来&#xff0c;贴近生活。从管理员通过正确的账号的密码进入系统&#xff0c;可以使用相关的系统应用。管理员总体负责整体系统的运行维护&#xff0c;统筹协调。 系统整体模块设计&#xff1a;系统分为管理员和用户两大角色&#xff0c;系统管理员…