Spring底层

配置文件

配置优先级

之前讲解过,可以用这三种方式进行配置
那如果这三种都进行了配置,那到底哪一份生效呢?
结论

优先级从大到小
properties>yml>yaml

然后就是现在一般都用yml文件进行配置
在这里插入图片描述

其他配置方式

除了配置文件外
还有不同的配置方式
可以通过Java系统属性或者命令行参数的方法进行配置
且命令行参数的优先级大于Java系统属性
在这里插入图片描述
在这里插入图片描述
对应开启界面
在这里插入图片描述

在这里插入图片描述
那如果项目已经打包或者上线了,那怎么设置Java系统属性和命令行参数呢

在这里插入图片描述
运行jar包到对应的文件夹,jar java系统属性(可填可不填)-jar jar包名字 命令行参数(可填可不填)
在这里插入图片描述

综合优先级

在这里插入图片描述

bean的管理

获取bean

除了使用
@AutoWired自动注入DI的方式
还能手动的获取IOC容器中的bean对象
在这里插入图片描述

想要获取IOC容器里面的bean对象
首先要获得IOC容器
IOC容器就是我们的applicationContext对象
获取IOC容器的过程

@AutoWired
private ApplicationContext applicationContext;
谁能想到,获取IOC容器还是要自动注入

在这里插入图片描述

获取之后
发现我们获取的某一个bean对象都一样
默认情况下这个bean是单例的,能不能设置成非单例呢?
当然可以
和下一章节bean作用域有关
在这里插入图片描述

bean的作用域

大部分开发但是单例bean用@Scope情况不多,默认就可以奥
bean的作用域和使用bean时到底是创建新的bean对象还是只有一个有关
这里有五种作用域
我们只用关注前两种
singleton和prototype两种即可
一个是单例一个是每次使用bean对象会创建新的实例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
@Lazy是使对应的bean对象在第一次使用再进行初始化(默认是在容器启动的时候进行初始化)
@Scope(“”)就是对应的作用域了呗
更改了以后调用就是不同的对象
在这里插入图片描述

第三方bean

在这里插入图片描述

这种我们自己的定义的类可以用注解
在这里插入图片描述
但是如果是第三方依赖提供得的类
我们怎么让他交给IOC容器管理呢?
比如这个dom4j提供的SAXReader解析xml文件的类(不交给IOC容器就每次都需要new,用Sping框架其实叫给IOC用的时候进行依赖注入就可以了)
so怎么把第三方类弄成bean呢?
在这里插入图片描述
两种方法
1.就是在启动类,创建方法用@Bean注解
2.就是新建一个配置类,用@Configuration注解类
还是新建方法用@Bean注解,返回值为我们想交给IOC容器管理的第三方类对象

在这里插入图片描述
还有这两种方式默认是用方法名作为bean对象的名字
也可以用value和name属性去起名
在这里插入图片描述
如果想在声明第三方bean对象进行依赖注入怎么从操作呢?
很简单
只需要在方法上写个参数,他就会自动去IOC容器中寻找并且注入
不需要用什么@AutoWired
在这里插入图片描述

SpringBoot原理(面试)

在这里插入图片描述
Spring在4.0退出SpringBoot来简化Spring开发
SpringBoot相较于Spring有两点
一方面是起步依赖,一方面是自动配置
在这里插入图片描述

起步依赖

使用原始Spring框架进行开发,需要一个一个导入依赖还要版本匹配
在这里插入图片描述
而使用SpringBoot只用引入一个依赖即可
比如我们想要Web开发引入对应的web开发的起步依赖
下面就包含了我们web开发常用的依赖
原理:maven的依赖传递,maven中A项目依赖B,B项目依赖C,那么如果你现在用一个D项目导入了A依赖,它会同时他B和C依赖进行导入

在这里插入图片描述

自动配置

概述

所谓的自动配置
就除了我们自己定义的bean对象
引入依赖后是怎么讲jar包里的定义的配置类和bean加载到我们的IOC容器
在这里插入图片描述
比如这里我们并没有声明其他的bean对象
但是它还是在IOC容器中存储着,这就是我们导入依赖
对应自动交给了IOC容器,我们要探究的就是,它是怎么交给IOC容器的
在这里插入图片描述

原理(SpringBoot原理)!!!

几种将依赖的bean对象交给IOC容器的方案

现在我们自己写一个maven项目
itheima-utils中定义三个bean对象
TokenParser(@Component)、headerParser和headerGenerator(@Bean方式)
在这里插入图片描述
此时我们导入该项目到我们另一个项目
按理来说bean对象可以直接用了,但是会报错
为什么呢?
讲IOC说过不是加了@Component就会生效的,还需要被组件扫描到
启动类上面的注解@SpringBootApplication只会扫描当前包以及其子包下的
所以这个项目在不在外面启动类包下肯定扫描不到,怎么解决呢?

在这里插入图片描述

方案1@ComponentScan

用@ComponentScan在启动类上指定要扫描的包,对应启动类就能扫描到了
注意:我们一旦声明这个注解,默认扫描的本包及子包会失效,所以一般我们是需要把启动类所在的包也写上去,把本包的也扫描到
在这里插入图片描述

但是你可以发现我们导入其他的官方依赖没有让我们这么做
因为这种太麻烦了
so肯定有别的方法

方案2

导入可以导入普通类,这个类就变为IOC容器的bean类
导入配置类的话,这个配置类中所有bean对象都会加载到IOC容器中
在这里插入图片描述

在这里插入图片描述
接口实现类,实现对应的ImportSelector
实现对应的SelectImoprts方法
返回值是String[],对应想要谁交给IOC
就把对应全类名写入这个字符串数组中
在这里插入图片描述
当然这种方式我们还需要知道对应的第三方依赖的哪些配置类和哪些bean类
其实第三方最清楚我们需要导入的bean和配置类
所以一般我们都不是自动导入
而是第三方依赖给我们提供一个注解
@EnableXxxx注解
这个注解封装着@Import注解
如图是对应注解
上面有@Import标识对应我们想导入的bean
在这里插入图片描述
然后在 对应启动类上加入上提供的注解即可扫描到对应的bean

在这里插入图片描述

源码跟踪

springboot最重要的注解就是对应springboot启动类上的能够注解
我们通过这个来分析源码怎么完成自动注入
最上面
四行是源注解就不解释了
然后@SpringBootConfiguration在这个注解里
含一个@Configuration表示该类也是一个配置类,所以之前我们能在启动类定义bean

再看@ComponentScan这个就是我们对应的组件扫描的注解
最后我们看@EnableAutoConfiguration
这个就是我们自动配置的核心注解
在这里插入图片描述

@EnableAutoConfiguration的源码
封装了一个@Import({AutoConfigurationImportSelector.class})
在这里插入图片描述
我们再来看这个AutoConfigurationImportSelector
这个类实现了DeferredImportSelector(ImportSelector的子接口)
前面说过实现selectImoprt方法的返回值决定
哪个类会交给IOC容器
找到这个方法,看到这个返回值
在这里插入图片描述
调用autoConfigurationEntry.getConfigurations()
我们看就看autoConfigurationEntry对象到底是啥
找到后,可以发现它封装了
configurations和execlusions
当然我们主要看configurations,调用的就是getConfigurations(),就是对应它里面的数据呗
在这里插入图片描述
这个就是那个给configurations赋值的语句
我们进入这个方法
在这里插入图片描述
对应方法
在这里插入图片描述
看那个提示信息,当configurations为null时
提示在这里插入图片描述
这两个文件中没有查询到自动配置信息

所以推一下底层
springboot启动会加载这两个文件中配置的信息
封装到List集合configurations中
然后这个结合内容会转换为String[]
到selectImports就是需要加入IOC容器的bean类名、配置类
所以
我们只需要把我们想要加入IOC的全类名写入到对应文件中即可
现在关键点就是找到这两个文件
一般起步依赖当中都会有这两个文件
比如这个mybatis的起步文件
里面就含着一个传递下来的依赖
mybatis-spring-boot-autoconfigure2.2.2
这个里面就包含那个自动配置文件
在这里插入图片描述
然后我们看呗
果真有这两个个文件,包含了我们对应想要加入IOC容器的全类名
在这里插入图片描述
spring.factories和org.springframework.boot.auotconfigure.AutoConfiguration.imoprts
都是可以加入IOC中的(不是全部的这些类都要加入IOC容器)
不同之处spring.factories是早期的自动配置文件,而那个长的名字的文件是2.7.0版本后提供的一个全新的配置的文件,2.7.x版本会兼容spring.factories,但到3.x的版本后就不支持spring.factories了,所以弄那个长的文件就ok
org.springframework.boot.auotconfigure.AutoConfiguration.imoprts
是以AutoConfiguration为结尾的一些类(我们称为自动配置类)
比如之前我们那个gson
就是定义在一个类(配置类)中
然后这个类的全类名写入了org.springframework.boot.auotconfigure.AutoConfiguration.imoprts文件中
这样就自动配置
所以我们就把这个加载到IOC容器中了
在这里插入图片描述

源码小结

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

不同之处spring.factories是早期的自动配置文件,而那个长的名字的文件是2.7.0版本后提供的一个全新的配置的文件,2.7.x版本会兼容spring.factories,但到3.x的版本后就不支持spring.factories了,所以弄那个长的文件就ok

@ConditionalOnMissingBean就是你需要满足一定条件才会加入到IOC容器的bean
下一章节我们就讲解这个注解是如何进行条件装配的

@ConditionalOnMissingBean条件装配注解

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java】对ArrayList中的元素进行排序的几种方式

对ArrayList中的元素进行排序的几种方式 一、使用Collections工具类 1、对基本类型排序 通过Collections.sort()对基本类型排序默认是以升序排序 // 1.Collections.sort()默认按照升序排序 List<Integer> integerList new ArrayList<>(); Collections.addAll(…

N天爆肝数据库——MySQL(5)

本文主要对索引进行了讲解 这里写目录标题 本文主要对索引进行了讲解索引概述介绍优缺点索引结构二叉树红黑树B-Tree(多路平衡查找树)BTreeBTree与B-Tree区别: HashHash索引特点 为什么InnoDB存储引擎选择使用BTree索引结构&#xff1f;索引分类在InnoDB存储引擎中&#xff0c;…

KUKA机械臂的导纳控制

KUKA机械臂的导纳控制 在近期的实验中&#xff0c;需要根据传感器的给出的实时位置信息进行导纳控制&#xff0c;并实时改变导纳控制的参数。由于KUKA自带的实时导纳控制模型无法实时修改参数&#xff0c;因此尝试了自己实现导纳控制。网上这方面的资料比较少&#xff0c;整理…

Notepad++ 配置python虚拟环境(Anaconda)

Notepad配置python运行环境步骤&#xff1a; 打开Notepad ->”运行”菜单->”运行”按钮在弹出的窗口内输入以下命令&#xff1a; 我的conda中存在虚拟环境 (1) base (2) pytorch_gpu 添加base环境至Notepad中 cmd /k chdir /d $(CURRENT_DIRECTORY) & call cond…

Redis相关配置(3)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…

[ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择

前几天看到一个问答帖&#xff0c;我回答完了才发现这个帖子居然是去年的也没人回复&#xff0c;其中他问了一些华为云的问题&#xff0c;对于其中的一些概念&#xff0c;这里来总结讲解一下&#xff0c;希望对学习华为云的小伙伴有所帮助。 文章目录 区域&#xff08;Region&a…

three.js学习

前言&#xff1a; three.js基本使用没问下&#xff0c;下面进入自定义图形 效果展示 实现 使用BufferGeometry()自定义 <script setup lang"ts"> import { ref, onMounted } from vue import * as THREE from three // 导入轨道控制器 import { OrbitContro…

概率论的学习和整理--番外12:一个经典dubo模型的概率计算等

目录 1 经典模型知识科普 1.1 知识来源 1.2 下面是摘取的部分规则 2 这个经典dubo的概率和期望 2.1 网上计算的概率&#xff0c;期望全是负&#xff0c;赌徒悲剧 2.2 为什么会这样呢 3 假设把下注庄家不抽水&#xff0c;获得100%收益而不是95&#xff0c;多少次后可以赢…

leetcode 965.单值二叉树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;单值二叉树 思路&#xff1a; 让当前的根节点与左孩子节点与右孩子节点判断&#xff0c;若相等则继续向下分治&#xff0c;让左孩子与右孩子当作新的根节点继续判断&#xff0c;直到某个节点不相等。 1️⃣ 代码&#x…

数组与指针

博客内容&#xff1a;数组与指针 文章目录 一、 数组&#xff1f;指针&#xff1f;1.区别与联系大小赋值存储位置 二、指针数组、数组指针&#xff1f;二维数组和二级指针&数组名与数组的区别总结 一、 数组&#xff1f;指针&#xff1f; 数组 相同类型数据的集合 指针 指…

TortoiseGit 入门指南11:还原与重置

Git 就像个时光机器&#xff0c;能让我们还原到任何提交。 还原未提交的更改 假如我们在查看一个干净的代码仓库&#xff0c;干净意味着工作区中的文件保持着最后一次提交的状态&#xff0c;没有修改。在查看的过程中&#xff0c;我们有意或无意的修改了工作区中的文件&#…

pwm呼吸灯

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …