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对象
在这里插入图片描述
当然这种方式我们还需要知道对应的第三方依赖的哪些配置类和哪些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条件装配注解

都是@Conditional的子注解
这些注解和bean注解相互结合
来作为变成bean的条件
在这里插入图片描述
@CoditionalOnClass(name=“”/value=“”)
这个可以指定name-字节码文件对应的全类名(字符串数组)或者value-字节码文件对象(Class<?>)
如果 当前环境有Jwts这个类的话(以下面那个图片为例子),这个对象就会作为bean对象加入IOC容器
在这里插入图片描述
@ConditionalOnMissingBean
这个也可以指定name和value,但大多数就不写东西后面
他是以方法的返回值作为判断标准
如果你在项目里自己定义了这个类型的bean
它就不会注册到IOC,如果没有的话才会作为bean注册到IOC容器
也可以指定类型通过value属性,或者指定名称通过name属性

@ConditionalOnProPerty(name=“” value=“”)
这个条件就是看你spring的配置文件有没有对应的键值对K-V
有的话就作为bean注册到IOC容器
没有的话就不注册
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

自定义Starter

就是我们自己定义一个起步依赖

在这里插入图片描述

起步依赖和自动配置关系!!!(疑惑点)

起步依赖一般不含java代码
里面最重要功能就是配置文件中的依赖项目
一般起步依赖…-starter这种都会依赖上…-autoconfigure
这已经是起步依赖和自动配置类的关系
所以一般我们依赖上起步依赖就可以自动配置那些bean对象
然后一般auto…模块就是来配置bean对象的包含很多包和配置类
在这里插入图片描述

案例

在这里插入图片描述
建立好starter项目和auotconfigure项目
让starter依赖上autoconfigure项目
在这里插入图片描述
作为依赖的话starter的配置文件和启动类和测试类都可以删了

把功能整合一下,报错修改一下

你看啊,properties那个类是一个参数类,而Utils那个类是工具类
因为Utils本来是整合这properties里面的内容的
所以我们需要新建一个自动配置类
返回AliyunOSSUtils的新建类
然后把properties变成bean,bean中调用bean直接写在参数上即可
在这里插入图片描述

最后需求是AliyunOSSUtils作为bean注入IOC
这个就是那个自动配置类
在这里插入图片描述
建那个META-INF什么的
写上对应全类名
在这里插入图片描述
现在在别的项目依赖后
直接注入即可
在这里插入图片描述

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

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

相关文章

stm32读取DHT11温湿度传感器

stm32读取DHT11温湿度传感器 一.序言二.DHT11响应数据格式三.DHT11通讯过程3.1 产生起始信号3.2 读取数据03.3 读取数据1DHT11停止信号 四.代码实例4.1读取DHT11源文件4.2 读取DHT11头文件 五.结语5.1 总结整体思路5.2 对读者的期望 一.序言 我们知道DHT11是单总线协议&#x…

基于Java+SpringBoot+Vue前后端分离仓库管理系统详细设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

kubernetes中特定域名使用自定义DNS服务器出现的解析异常

故障发生背景&#xff1a; 租户反馈生产业务服务连接到中间件的时候&#xff0c;偶尔会有连接失败的情况&#xff0c;然后我们查看对应组件服务正常&#xff0c;手动请求组件服务也显示正常&#xff0c;让租户查看业务服务日志发现报错无法解析对应的域名&#xff0c;我们手动是…

Spring Batch之读数据库—JdbcPagingItemReader(四十一)

一、JdbcPagingItemReader Spring Batch框架提供了对JDBC分页读取支持的组件JdbcPagingItemReader。JdbcPaginItemReader实现ItemReader接口&#xff0c;核心作用是将数据库中记录通过分页的方式转换为Java对象。在JdbcPagingItemReader将数据库记录转换为Java对象是主要有两步…

C 知识积累 回车与换行 Linux C 语法分析

目录 回车与换行一.知其然二.知其所以然 关键字&#xff0c;操作符和函数区别1&#xff1a;关键字2&#xff1a;操作符3&#xff1a;函数 命令行参数argv原码补码补码加法 Linux C 语法分析结构体指针类型函数宏定义其他 const语法整理 回车与换行 一.知其然 \n是换行&#x…

【矩阵的创建与基本运算】——matlab基础

目录索引 创建矩阵&#xff1a;zeros()&#xff1a;ones&#xff1a;eye()&#xff1a;magic()&#xff1a;引号创建序列矩阵&#xff1a;linspace()&#xff1a; 加减与数乘&#xff1a;其他运算&#xff1a;指数运算&#xff1a;*exp()&#xff1a;* 点式运算&#xff1a; 创…

SpringBoot 整合 RabbitMQ demo

Rabbit Windows安装教程 本文只做Demo案例的分享&#xff0c;具体只是需自行百度 一、生产者 1.application.properties 配置Rabbit的基本信息 #rabbit 主机IP spring.rabbitmq.host127.0.0.1 #rabbit 端口 spring.rabbitmq.port5672 #rabbit 账号 可自行创建 这里是默认的 …

springboot与rabbitmq的整合【演示5种基本交换机】

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;后端专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

Makefile:6: *** missing separator. Stop.

Makefile:2: *** missing separator. Stop. Windows下用VS CODE编写makefile文件&#xff0c;编译报出这个错误 可以查看一下VS CODE左下角&#xff0c;如果是下图“空格&#xff1a;4”这样&#xff0c;需要更改一下。 在“空格&#xff1a;4”上左键单击一下&#xff0c;在…

涂鸦智能打造专业家庭智能生活助手,实现人机交互升级

近年来&#xff0c;智能家居设备的品类不断拓展&#xff0c;同时&#xff0c;人们对AI与智能家居的联动愈发憧憬。自然语言交互是未来人机交互的主要趋势之一&#xff0c;其关键在于使AI具备主动理解信息的能力&#xff0c;让用户的交互更轻松。如何将智能场景的交互变得更“善…

【动手学深度学习】--15.含并行连结的网络GoogLeNet

文章目录 含并行连结的网络GoogLeNet1.Inception块2.GoogLeNet模型3.训练模型 含并行连结的网络GoogLeNet 学习视频&#xff1a;含并行连结的网络 GoogLeNet / Inception V3【动手学深度学习v2】 官方笔记&#xff1a;含并行连结的网络&#xff08;GoogLeNet&#xff09; 1.…

基于Web API drap事件的简单拖拽功能

基于Web API drap事件的简单拖拽功能 效果示例图代码示例 效果示例图 代码示例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-s…

单例模式、指令重排序、锁、有序性

今天在回顾单例模式时&#xff0c;我们都知道懒汉式单例中有一种叫做双重检查锁的单例模式。 我们来看下下面的代码有没有问题&#xff1a; 这段代码我们可以看到&#xff0c;即优化了性能&#xff0c;在多线程情况下&#xff0c;如果实例不为空了&#xff0c;则直接返回了。…

Vue成绩案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能

一、成绩案例 ✅✅✅通过本次案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能。 准备成绩案例模板&#xff0c;我们需要在这些模板上面进行功能操作。 <template><div class"score-case"><div class"table">…

Rsync(二十七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、特性 三、应用场景 四、数据的同步方式 五、rsync传输模式 六、rsync应用 七、rsync 命令 1. 格式 1.1 作为远程命令 1. 2 作为rsync服务 2. 选项 3.…

解密:GPT-4框架与训练过程,数据集组成,并行性的策略,专家权衡,推理权衡等细节内容

大家好&#xff0c;我是微学AI&#xff0c;今天给大家解密一下GPT-4框架与训练过程&#xff0c;数据集组成&#xff0c;并行性的策略&#xff0c;专家权衡&#xff0c;推理权衡等细节内容。2023年3月14日&#xff0c;OpenAI发布GPT-4&#xff0c;然而GPT-4的框架没有公开&#…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后&#xff0c;【OBJECTID】字段会变得不规律。应部分网友要求&#xff0c;做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具&#xff0c;已经可以完美实现这个功能需求&#xff0c;发现自己做了个白工。 不过做了不能白…

【最新教程】树莓派安装系统及VNC远程桌面连接

大家好&#xff0c;今天就不给大家介绍PYTHONL ,今天我作为一个刚入坑树莓派的小白&#xff0c;整理了一下自己安装树莓派的整个过程&#xff0c;分享给大家。 目录 树莓派 准备工作&#xff1a; 树莓派远程ssh失败access denied 原因&#xff1a; 树莓派系统安装 1、下载…

hive常用方法

日期类 Date_sub 日期进行加减 &#xff0c;正的减&#xff0c;负的加 select current_date -- 当前日期,date_sub(current_date,1) -- 前一日,date_sub(current_date,-1) -- 后一日 from edw.test;字符类 split 该函数是分割字符串 &#xff0c;按照…

ChatGPT火热之下的冷思考

作为一款基于人工智能的自然语言处理(NLP)​​聊天机器人​​程序&#xff0c;ChatGPT通过大量来自互联网的文本进行训练&#xff0c;并使用深度学习和机器学习算法来理解用户的问题并提供准确的回答。并且&#xff0c;ChatGPT还内置了情感分析、关键字提取和实体识别等功能&am…