IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot 札记(自动装配原理) -> 正文阅读

[Java知识库]SpringBoot 札记(自动装配原理)

目标:

了解 SpringBoot 的自动装配原理


学习步骤:

1、了解 父依赖管理特性
2、自动配置包 spring-boot-autoconfigure
3、自动配置原理

一、SpringBoot 父依赖管理特性

在这里插入图片描述

新建完项目,为什么我们只导入了这个包 就可以运行web项目了呢 ? 连依赖版本号都不用 ?

现实肯定不是这样子的,我们点进去 spring-boot-starter-web 看看

在这里插入图片描述

可以看到一个 spring-boot-dependencies 依赖,进去看看

往下拉可以看到一大堆版本信息

在这里插入图片描述

同样的,我们在 pom.xml 文件的开头也可以进入依赖管理文件

在这里插入图片描述

如果进不去,就降低版本

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
看了 spring-boot-dependencies 之后发现:核心依赖在父工程中!所以我们才不需要声明版本信息

我们在写或者引入一些 SpringBoot 依赖的时候,不需要指定版本,就因为有这些版本仓库

此时就有一个问题了 我们先看看这个情况

在这里插入图片描述

很大一部分公司MySQL用的是5版本的咋整?

肯定不能在这个文件进行修改呀,得在pom.xml文件中进行版本指定(重新覆盖)

比如还是想用 MySQL5版本

在这里插入图片描述
在这里插入图片描述

上面指定MySQL的版本后 , 下面引入同样无需写版本号

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>

此时查看依赖项目版本信息

在这里插入图片描述

或者,还可以利用如下写法 指定MySQL的版本号信息,直接写版本号,但是这样子不容易做项目全局控制,一般公司的项目都有标明用什么技术的什么版本,所以我们一般都是在最上面的<properties> 属性中声明项目所需版本信息

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.47</version>
</dependency>

二、自动配置包 spring-boot-autoconfigure

我们可以通过这个WEB启动器来挖掘 SpringBoot的自动配置包在哪里

在这里插入图片描述

进入该文件,可以看到还有一个spring-boot-starter启动器

在这里插入图片描述

进入这个启动器,又可以看到一个spring-boot-autoconfigure包 翻译过来就是自动配置类

在这里插入图片描述

SpingBoot 所有的自动配置功能都在 spring-boot-autoconfigure 包中,项目中有很多 starter 启动器,SpringBoot 会按需加载所有的自动配置项,只有引入了这个 starter 启动器,该场景下的自动配置才会开启

三、自动配置原理

3-1、引导加载自动配置类

还是从 Main 方法着手

在这里插入图片描述

查看 核心注解 @SpringBootApplication 注解

在这里插入图片描述

发现它其实就是下面 三个注解的整合

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

核心:换句话说就是将 @SpringBootApplication 注解替换成 这三个注解,程序照样正常运行在这里插入图片描述


3-2、@SpringBootConfiguration 注解

进去看看

在这里插入图片描述

也就是说 这个注解 存在的意义 就是让我们的 主类 变成配置类 (此时主类就变成核心配置类)


3-3、@EnableAutoConfiguration 注解 (重点:开启自动配置功能)

点进去一看,发现是两个注解的合成

在这里插入图片描述


3-3-1、先看看 @AutoConfigurationPackage 注解

在这里插入图片描述

@AutoConfigurationPackage 注解的 这个 @Import 只是给容器中导入一个AutoConfigurationPackage.Registrar 组件

在容器中 导入一个注册类 Registrar , 进去看看

在这里插入图片描述

此时它利用 Registrar 给容器中导入一些组件(批量导入)

new PackageImports(metadata).getPackageNames() 就是在获取 Main类 的所在的包名 com.csnz , 转换为数组

所以 @AutoConfigurationPackage 注解 的作用就是 将Main主类包下的所有组件进行导入(即 com.csnz 包下)


3-3-2、再看 @Import注解

在这里插入图片描述

发现 他是导入一个 AutoConfigurationImportSelector 包 ,这个包的作用也是 批量导入

进入此类中,往下拉可以看到一个方法

此方法 决定了我们需要导入的bean,它会封装成一个数组返回

在这里插入图片描述

进入这个 获取自动配置入口 的方法看看

在这里插入图片描述

此方法还有一个需要注意到的点,就是 获取候选配置方法

在这里插入图片描述

进去瞧瞧

在这里插入图片描述

看看 Spring工厂加载机制的 loadFactoryNames 方法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

查看资源,发现他是从 META-INF/spring.factories 位置加载文件的,默认扫描我们当前系统里面所有 META-INF/spring.factories 位置的文件,因为有众多包拥有此文件,所以我们只需关注一个包即可,那就是自动配置包 spring-boot-autoconfigure-2.3.7.RELEASE.jar

那这个自动配置包在哪里呢 ?

在这里插入图片描述

进入文件可以看到 Auto Configure 下有大量的自动配置类

文件里面写死了 SpringBoot 一启动就要给容器中加载的所有配置类

在这里插入图片描述


3-3-3、是否一启动就导入全部自动配置项呢?

肯定不是的,SpringBoot 会按需开启自动配置项

在这里插入图片描述

虽然我们 127 个场景的所有自动配置启动的时候默认全部加载,但是你打开具体文件,他里面是按照条件装配规则来决定是否加载的(@Conditional注解),所以最终是会按需进行配置的


3-4、 @ComponentScan 注解

在这里插入图片描述

其实就是用于指定 spring 在初始化容器时要扫描的包,这在学习Spring初期注解就涉及到了


自动配置总结:

1. SpringBoot 先加载所有的自动配置类 xxxAutoConfiguration (比如批处理)
在这里插入图片描述

2. 每个自动配置类 会根据里面内部的条件 决定是否注入Bean,每个文件中都默认绑定了配置文件指定的值,从xxxProperties类中拿,而xxxProperties类又和配置文件进行了绑定在这里插入图片描述
在这里插入图片描述

3. 生效的配置类就会给容器中装配很多组件
4. 只要容器中有这些组件,相当于这些功能就具有了
5.实现定制化配置

  • 5-1. 第一种方式:用户自己 写方法 @Bean 替换底层的组件
  • 5-2. 第二种方式:用户查看此组件是获取配置文件的什么值就去修改,根据组件文件中绑定的前缀信息去application.properties文件中修改即可
  • 5-3. 流程:xxxAutoConfiguration ==> 对应的组件 ? xxxProperties类中拿值 ==> 在 application.properties中修改
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:26:07  更:2022-02-22 20:26:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:28:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码