Spring底层的核心原理解析

这篇文章大致讲解一下spring的整个执行流程,也就是在我们脑子里面建立一个笼统的概念

spring如何创建一个容器呢

容器里面是对象

上面就是利用AnnotationConfigApplicationContext这个对象,然后传入了一个配置类的字节码对象给我们创建一个Spring容器,然后我们利用这个容器,就可以创建我们想要的对象

那我们还有什么方法来创建容器呢?

采用ClassPathXmlApplicationContext("bean.xml"),这个对象就是通过spring的xml配置文件来获取对象,下面我们看一下具体的代码

下面我们去看获取

 

下面看一下这几个类与类之间的依赖关系

 上面就是这两个类的具体使用方法

下面讲解一下Spring对象的大致构建过程

我们知道Spring是会帮我们创建一个UserService对象,那么他与我们直接new出来的一个对象有什么不同呢?

比如下面这两个对象

都是创建UserService对象,不同点在哪?

我们先来看一下UserService的对象内部 

里面有一个OrderService对象,已经采用@Autowired这个注解给我们注进来了

说明了Spring在构建这个UserService的时候,已经帮我们创建了OrderService这个对象,那么如果我们直接new UserService(),很明显内部这个OrderService是没有对象指引的,因为在UserService内部就没有一个有参的构造函数给orderService这个属性传递值,也没有什么可用方法调用给OrderService赋值

这就是一个小的不同点

那么面继续分析,如果spring要生产一个UserService对象,那么无非就要去调用它的构造方法,这里肯定是无参构造方法,也就是说

那么内部还有一个对象啊,他也是给我们生产出来的,就是OrderService这个对象

下面是具体的操作代码 

那么field.set()方法里面的orderService的值具体怎么来呢?

那我们继续往下面走,假设我们现在给这个Userservice里面增加一个属性

 假设这个admin是我们管理员账号与密码,我们想的是UserService一旦被Spring 创建,那么里面的Admin就要自动填充好值,如果说给Admin添加一个Autowired当然也是可以,但是如果这样的话,那么拿到的值就不是我们想要的,因为admin需要我们去查询数据库,然后封装一个User对象,然后在给到他,但是spring是真不知道怎么去查数据库,去查什么表的。

所以,我们在这下面可以给它设置一个方法

这个方法加了@PostConstruct注解

这个注解的意思,在对象通过构造完成之后,就会调用起来

那么Spring的做法就是,还是用反射技术来做

 那我们还有一种做就是我们让UserService这个类去实现Initialize这个接口。然后去实现里面的afterPropertiesSet()这个方法,也可以执行上面的操作

比如按照下面做法来做

 判断是否是是他的实例子啊初始化的时候,可以做如下判断

obt instanceOf InitializingBean(是否是它的实例)

我们简单去看一下源码:Ctrl+N

然后我们直接跳转到下面这个函数里面

 然后再进如到下面这个函数里面

 总结一下,下面大概就是Bean的创建的生命周期

 如果一个对象里面不止有无参构造函数呢

 

 下面说一下Spring的判断逻辑

 

说的简单点,只要有无参,一定会调用无参进行对象的构建,如果有多个有参,没有无参,但是没在某一个构造方法加上@Autowired注解 ,就会报错,spring不知道用哪一个构造方法

如果Spring选择了一个有参构造方法,需要传入参数,那么参数是怎么来的

 确定用哪个构造方法,确定入参的Bean对象,这个过程就叫做推断构造方法。

AOP的大致流程

 我之前说切面的时候,就说了切面就是一个类直接杀向另外一个类里面来,对另外一个类里面的方法做一些增强操作,这里应该是用到了动态代理技术去增强目标对象的方法

先来解释上面的话:1.找出所有切面Bean

 在xml配置文件里面就是下面这样

2.遍历切面中的每一个方法,看看是否写了@Before(前置通知) @AfterReturning(后置通知)这些注解在上面

 3.如果写了,我们去看对应的Pointcut对应的拦截点与当前我们需要生成的代理对象是否匹配,如果匹配,就表示需要把当前对象进行AOP会给我们生成一个代理对象

如果找到了,就用cglib动态代理我们的每一个切入点进行动态代理增强

这里简单说一下cglib

 

下面说一下Cglib进行AOP的大致流程 

 

 好了,大致先说到这,祝大家早安午安晚安。

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

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

相关文章

Hyper-V 安装 CentOS (二)

总目录 https://preparedata.blog.csdn.net/article/details/132877836 文章目录 总目录一、Hyper-V 创建centos的虚拟机实例二、虚拟机安装Centos ISO镜像三、重启后,进入系统 一、Hyper-V 创建centos的虚拟机实例 网络连接先不选择,后面文章专门配置网…

【软考】系统架构设计师 - 知识扩展 - “区块链技术“

目录 一 简介👑 1 比特币❤️ 2 区块链的特点❤️ 3 共识算法❤️ 二 练习题👑 三 扩展👑 1 哈希算法❤️ 2 哈希指针❤️ 3 UTXO❤️ 4 参考资料❤️ 一 简介👑 1 比特币❤️ 比特币底层采用了区块链技术。 比特币交易…

03目标检测-传统方法与深度学习算法对比

目录 一、目标学习的检测方法变迁及对比 二、深度学习目标检测算法基本流程 三、传统目标检测算法VS深度学习目标检测算法 一、目标学习的检测方法变迁及对比 “目标检测“是当前计算机视觉和机器学习领域的研究热点。从Viola-Jones Detector、DPM等冷兵器时代的智…

【数据结构】二叉树的链式结构

【数据结构】二叉树的链式存储结构 二叉树的存储结构 typedef int BTDataType; // 二叉树的结构 typedef struct BinaryTreeNode {BTDataType data; // 树的值struct BinaryTreeNode *left; // 左孩子struct BinaryTreeNode *right;// 右孩子 } BinaryTreeNode;二…

EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565

使用工具:WPS 举例: EXCEL如何把一个单元格内的文本和数字批量分开?不使用数据分列。 第一步、将第二行数据冻结 第二步、在B1、C1单元格输入需要分开的示例 第三步、点击选中B1单元格,输入快捷键【CTRLE】进行填充。B2单元格也是…

【AIGC】图片生成的原理与应用

前言 近两年 AI 发展非常迅速,其中的 AI 绘画也越来越火爆,AI 绘画在很多应用领域有巨大的潜力,AI 甚至能模仿各种著名艺术家的风格进行绘画。 目前比较有名商业化的 AI 绘画软件有 Midjourney、DALLE2、以及百度出品的文心一格:…

MinGW-W64 下载、安装与配置(支持最新版的GCC,目前 GCC 13.2.0)VSCode配置c/c++环境 彻底删除vscode(包括插件及配置!)

目录 一、简介 二、下载 1 旧版安装(8.1.0) 从 sourceforge.net 下载 2 新版安装(本次采用较新版本~~~) 从 github 下载 从 镜像站点 下载 自己编译 三、安装与配置 1. 在线安装(这里仅作参考了解) 2. 离线安装&…

异步FIFO设计的仿真与综合技术(3)

概述 本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文,添加了笔者的个人理解与注释,文中蓝色部分为笔者注或意译。前文链接: 异步FIFO设计的仿真与综合技术&#xf…

自动化测试(五):自动化测试框架的搭建和基于yaml热加载的测试用例的设计

该部分是对自动化测试专栏前四篇的一个补充,本次参考以下文章实现一个完整的谷歌翻译接口自动化测试:   [1]【python小脚本】Yaml配置文件动态加载   [2]【python做接口测试的学习记录day8——pytest自动化测试框架之热加载和断言封装】 目标:框架封…

新增动态排序图、桑基图、AntV组合图,DataEase开源数据可视化分析平台v1.18.10发布

2023年9月14日,DataEase开源数据可视化分析平台正式发布v1.18.10版本。 这一版本的功能升级包括:数据集方面,对字段管理的后台保存做了相关优化,降低了资源消耗;仪表板方面,对联动、查询结果以及过滤组件等…

系统架构:软件工程速成

文章目录 参考概述软件工程概述软件过程 可行性分析可行性分析概述数据流图数据字典 需求分析需求分析概述ER图状态转换图 参考 软件工程速成(期末考研复试软考)均适用. 支持4K 概述 软件工程概述 定义:采用工程的概念、原理、技术和方法来开发与维护软件。 三…

GET,POST,DELETE,PUT参数传递的形式

一.get请求参数在地址后面进行拼接 1.代码&#xff1a; <template><div class""><button click"fn">点击</button></div> </template><script> import axios from "axios"; //安装完之后&#xff0…

MFC中嵌入显示opencv窗口

在MFC窗体中建立一个Picture Control控件,用于显示opencv窗口 在属性中设置图片控件的资源ID为IDC_PIC1 主要的思路: 使用GetWindowRect可以获取图片控件的区域 使用cv::resizeWindow可以设置opencv窗口的大小,适合图片控件的大小 使用cvGetWindowHandle函数可以获取到ope…

OpenCV(四十二):Harris角点检测

1.Harris角点介绍 什么是角点&#xff1f; 角点指的是两条边的交点&#xff0c;图中红色圈起来的点就是角点。 Harris角点检测原理&#xff1a;首先定义一个矩形区域&#xff0c;然后将这个矩形区域放置在我的图像中&#xff0c;求取这个区域内所有的像素值之和&#xff0c;之…

麒麟v10安装mysql(ARM架构)

下载MYSQL安装包 华为开源镜像站_软件开发服务_华为云 上面的选择一个下载 或者用命令下载 wget https://repo.huaweicloud.com/kunpeng/yum/el/7/aarch64/Packages/database/mysql-5.7.27-1.el7.aarch64.rpm 检查是否已经安装MySQL rpm -qa | grep mysql将包卸载掉 rpm -…

图论第三天|130. 被围绕的区域、417. 太平洋大西洋水流问题、827. 最大人工岛

130. 被围绕的区域 文档讲解 &#xff1a;代码随想录 - 130. 被围绕的区域 状态&#xff1a;开始学习。 思路&#xff1a; 步骤一&#xff1a; 深搜或者广搜将地图周边的 ‘O’ 全部改成 ’A’&#xff0c;如图所示&#xff1a; 步骤二&#xff1a; 再遍历地图&#xff0c;将 …

JWT 安全及案例实战

文章目录 一、JWT (json web token)安全1. Cookie&#xff08;放在浏览器&#xff09;2. Session&#xff08;放在服务器&#xff09;3. Token4. JWT (json web token)4.1 头部4.1.1 alg4.1.2 typ 4.2 payload4.3 签名4.4 通信流程 5. 防御措施 二、漏洞实例&#xff08;webgoa…

API原理概念篇(六)玩转正则表达式等常用API

一 玩转正则表达式等常用API ① 正则 1、openresty存在两套正则表达式规范1) lua自身独有的正则规范 备注&#xff1a;大约有5%&#xff5e;15%性能损耗损耗原因&#xff1a;表达式compile成pattern,并不会被缓存,每次都会被重新compile编译2) nginx的符合POSIX规范的PCR…

集合减法【新思路】

#include<stdio.h> int main() {int n,m,flag0;int x;int a[100001]{0},b[100001]{0};scanf("%d %d",&n,&m);以集合A所有元素作为数组下标映射值成1 for (int i 0; i < n; i) {scanf("%d", &x);a[x] 1; }以集合B所有元素作为数组下…

生产消费者模型的介绍以及其的模拟实现

目录 生产者消费者模型的概念 生产者消费者模型的特点 基于阻塞队列BlockingQueue的生产者消费者模型 对基于阻塞队列BlockingQueue的生产者消费者模型的模拟实现 ConProd.c文件的整体代码 BlockQueue.h文件的整体代码 对【基于阻塞队列BlockingQueue的生产者消费者模型…