Spring底层的核心原理解析

news2024/10/7 9:30:17

这篇文章大致讲解一下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.coloradmin.cn/o/1011365.html

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

相关文章

【力扣每日一题】2023.9.13 检查骑士巡视方案

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个n*n大小的矩阵,矩阵的元素表示骑士已经行动的次数,问我们骑士能不能按照矩阵里元素顺序来巡视整个…

(python语言程序设计教程)自学一

(python语言程序设计教程)自学一 文章目录 前言一、计算机基础概述1. 计算机硬件组成2. 计算机软件与程序设计语言 二、python语言简介三、turtle库3.1. 画布设置:3.2. 基本方法3.3. 基本图形绘制 四、课后习题4.1. 求圆柱体体积4.2. 绘制一个…

redis 多租户隔离 ACL 权限控制(redis-cli / nodejs的ioredis )

Redis 6版本之后:提供ACL的功能对用户进行更细粒度的权限控制 :(1)接入权限:用户名和密码(2)可以执行的命令(3)可以操作的 KEY ACL常用规则介绍: 指令列表 //增加可操…

学Python的漫画漫步进阶 -- 第六步

学Python的漫画漫步进阶 -- 第六步 六、容器类型的数据6.1 序列6.1.1 序列的索引操作6.1.2 加和乘操作6.1.3 切片操作6.1.4 成员测试 6.2 列表6.2.1 创建列表6.2.2 追加元素6.2.3 插入元素6.2.4 替换元素6.2.5 删除元素 6.3 元组6.3.1 创建元组6.3.2 元组拆包 6.4 集合6.4.1 创…

【Java 基础篇】Java类型通配符:解密泛型的神秘面纱

在Java中,类型通配符(Type Wildcard)是泛型的重要概念之一。它使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。本文将深入探讨Java类型通配符的用法、语法和最佳实践。 什么是类型通配符? 类型通配符是一…

ArcGIS 10.4安装教程!

软件介绍:ArcGIS是一款专业的电子地图信息编辑和开发软件,提供一种快速并且使用简单的方式浏览地理信息,无论是2D还是3D的信息。软件内置多种编辑工具,可以轻松的完成地图生产全过程,为地图分析和处理提供了新的解决方…

计算机毕设 大数据上海租房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…

算法与设计分析--分治算法的设计与分析

某不知名学校的第二次算法实验报告,一共四道题 全部来自力扣 第一题 ​​​​​​169. 多数元素 题目描述: 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&am…

Docker概念通讲

目录 什么是Docker? Docker的应用场景有哪些? Docker的优点有哪些? Docker与虚拟机的区别是什么? Docker的三大核心是什么? 如何快速安装Docker? 如何修改Docker的存储位置? Docker镜像常…

敏捷管理的4价值观12准则

一、敏捷管理的的4个价值观 个体和交互胜过流程和工具可工作的软件胜过面面俱到的文档客户合作胜过合同谈判响应变化胜过遵循计划 二、敏捷管理的12条准则 上篇解读了对于敏捷价值观的理解,这篇来聊一聊敏捷的12指导准则。关于敏捷宣言的12条准则的原始描述&…

Dokcer搭建Apache Guacamole堡垒机

一、什么是堡垒机 “堡垒机” 这个词通常指的是 “堡垒机器”(Bastion Host)的简称。堡垒机是一种计算机系统或网络设备,用于增强计算机网络的安全性。它在网络中充当一个重要的安全关口,通过限制对内部网络的访问,帮…

LeetCode(力扣)860. 柠檬水找零Python

LeetCode860. 柠檬水找零 题目链接代码 题目链接 https://leetcode.cn/problems/lemonade-change/ 代码 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:five 0ten 0twenty 0for i in range(len(bills)):if bills[i] 5:five 1if bills[i] 10…

pdf怎么压缩的小一点?pdf文件压缩方法汇总

在日常生活中,我们常常需要处理大量的PDF文件。有时候,这些PDF文件可能因为内容丰富、结构复杂而体积庞大,给我们的存储和传输带来了不便。那么,如何将这些PDF文件压缩得小一点,以便更方便地使用呢? 一、嗨…

Git(6)——GitHub

目录 一、简介 二、概要 三、注册 ​四、创建仓库 五、推送本地代码 六、拉取远端代码 一、简介 在Git(5)中,我们已经对Git分支的概念和用法有了一定了解,对于在本地进行代码版本管理,其实当前所学的东西基本已经…

【个人博客系统 × Redis】“最后的升级” · 连接Redis · Redis的基本使用

【JavaEE】进阶 个人博客系统(7) 文章目录 【JavaEE】进阶 个人博客系统(7)1. linux安装Redis1.1 通过yum商店下载Redis1.2 启动Redis1.3 操作Redis 2. Redis的基本使用(关键字大小写不区分)2.1 set2.2 g…

Lombok中的@Builder注解的使用

Lombok中的Builder注解的使用 作用 Builder注解的作用主要是用来生成对象,并且可以为对象链式赋值。 引入依赖 因为Builder注解是lombok中的东西,所以第一步我们需要引入lombok的依赖,如下图: 第二步给实体类加上Builder注解…

每日一博 - Token Based Authentication VS HMAC Authentication 实现web安全

文章目录 概念HMAC工作原理 概念 Token Based Authentication和HMAC(Hash-based Message Authentication Code)Authentication都是用于身份验证和数据完整性验证的安全机制,但它们有不同的工作方式和适用场景。以下是它们的主要区别和比较&a…

idea把项目打成jar包步骤详解

最近产品需要预研一个小功能,开始后在本地开发测试好之后,需要打成jar提供出去,今天弄完了,决定把这个步骤记录下来,便于以后轻车熟路。 打成jar要有mian方法的入口,所以我们在代码中需要定义一个main方法&…

学Python的漫画漫步进阶 -- 第七步

学Python的漫画漫步进阶 -- 第七步 七、字符串7.1 字符串的表示方式7.1.1 普通字符串7.1.2 原始字符串7.1.3 长字符串 7.2 字符串与数字的相互转换7.2.1 将字符串转换为数字7.2.2 将数字转换为字符串 7.3 格式化字符串7.3.1 使用占位符7.3.2 格式化控制符 7.4 操作字符串7.4.1 …

四、数学建模之图与网络模型

1.定义 2.例题及软件代码求解 一、定义 1.图和网络是相关概念 (1)图(Graph):图是数学和计算机科学中的一个抽象概念,它由一组节点(顶点)和连接这些节点的边组成。图可以是有向的&…