Spring框架学习笔记(本地印象笔记搬运)(整理中)

1、背景

Spring作为Java Web开发使用最频繁的框架,具有非常高的学习价值,在Spring框架源码中包含了很多设计模式(单例、原型、代理、观察者等),读懂这些源码有助于拓宽开发思路,同时也能提高后端排查错误的能力。以下将从IOC、DI、AOP三个主要模块进行Spring框架剖析,同时尝试手写实现Spring的基础功能。

2、Spring模块分析和手写

IOC

什么是IOC?

IOC(Inversion of control)控制反转将对象的获取途径交给spring管理,是spring的核心。
在这里插入图片描述

IOC有什么好处?
  • 简化代码,不需要去手动new常见的bean对象;
  • 面向接口编程,便于内容扩展;
  • 方便进行AOP编程;
IOC容器(Bean工厂)做了哪些工作?

负责创建和管理类实例,向使用者提供实例。
IOC容器又称为Bean工厂(工厂模式),使用者调用getBean()方法,工厂则查找相应的Bean定义,生成实例(返回Object对象)。
在这里插入图片描述

手写Spring IOC框架

整体设计思路
1、IOC容器本质上是一个bean工厂,主要实现bean的定义、创建和管理。因此我们需要先定义出Bean定义的模型,并把BeanDefinition交给BeanFactory,整体设计思路如图。

BeanDefinition
1、工厂的核心是创建bean对象,有三种方式:new、工厂成员方法、工厂静态方法,因此需要对外提供相应的接口
创建实例图
在这里插入图片描述

2、增强功能要求:
bean有作用域的区分(单例或原型),同时需要管理bean的生命周期(初始化、使用、销毁);
在这里插入图片描述

BeanFactory
1、BeanDefinition需要注册到BeanFactory中,该过程通过BeanDefinitionRegistry接口实现(注册+发现),并由BeanFactory实现类实现这些接口。
在这里插入图片描述

2、BeanFactory接口需要实现最基础的功能:获取bean,即getBean()方法;
3、所以,IOC中的默认bean工厂实现类(DefaultBeanFactory)包含以下功能:
(1)实现bean定义信息的注册;(registerBeanDefinition()方法实现,验证通过后放入beanDefinitionMap中)
(2)实现bean实例的创建;(通过构造器方法、静态工厂方法、工厂bean方法这三种方式的对象创建方式)
(3)实现初始化方法的执行;(通过doInit()方法实现)
(4)实现单例的要求;(可在系统启动时进行初始化,通过PreBuildBeanFactory子类实现)
(5)实现容器关闭是执行单例的销毁操作(通过close()方法实现)
最终逻辑对应类图如下:

4、增强功能:
- 给bean实例增加别名。允许多个别名,也可以有别名的别名(通过AliasRegistry接口中的方法实现针对别名的CRUD)。

- 增加更多获取bean实例的接口方法(除了根据beanName以外,还可以根据class类型来获取bean实例的Map/List集合)

(此时需要考虑建立type(class)与beanName之间的关系,需要建立一个一对多的Map集合)
-
最终类图如下:
在这里插入图片描述

DI

介绍

DI(Dependency injection)依赖注入,对象之间的依赖由IOC容器在运行期决定,即容器会动态地将某个依赖注入到对象中,也就是bean对象的成员变量赋值。

哪些地方会有依赖
  • 构造参数依赖(构造方法)
  • 属性依赖(getter和setter)

AOP分析

3、bean的生命周期

1、创建
2、使用
3、销毁

4、常用注解

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

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

相关文章

win10免安装配置MySQL8.4.0

注:此教程基于win10 22H2 版本 1、下载最新版本MySQL压缩包 下载链接:MySQL官网下载地址 点击第二行的 ZIP Archive 后面的Download(当前时间2024-06-19最新版本是8.4.0) 2、解压并添加配置文件 下载完毕后,解压缩…

Java程序之可爱的小兔兔

题目: 古典问题,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 兔子的规律为数列1,1,2,3,…

【数据结构与算法】Dijkstra算法、Floyd算法

文章目录 最短路径Dijkstra算法实现 Floyd算法实现 最短路径 前文提到,对于不带权图来说,BFS可以解决最短路径问题,因为它是类似于树的层次遍历那样,同一个结点的后继的访问顺序相邻,这使得BFS首次访问结点时的路径必…

CCRC-DSO数据安全官和CCRC-DSA数据安全评估师的差异

在当前时代背景下,随着中国数据安全政策的加速推进和相关法律法规的密集发布,对数据资产进行全生命周期的安全管控变得日益迫切。 这不仅成为企业可持续发展的必要条件,也引发了广泛的关注于数据安全相关的专业培训及认证领域。 在此环境下&a…

PS系统教程26

PS与BR的关系 如何把图片以图层的方式导入画板里面 选中三张图片/多张选择工具-PS-将文件载入PS图层意味着这三张图片以图层的方式嵌入PS中 拼接长图 裁剪图片 保存裁剪后的图片拼接图片选中要拼接的图片选择工具-PS-Photomerge(拼合图像) 图像处理器 大白话&…

对撞指针技巧

对撞指针技巧 我们以LeetCode的一道题目来讲解一下对撞指针; LeetCode第27题移除元素,链接如下: https://leetcode.cn/problems/remove-element 如果使用快慢指针 如果使用快慢指针,将会有大量的后面元素赋值给前面元素的操作…

Open3D 点云随机下采样至指定数目

目录 一、背景 二、代码实现 2.1 关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2下采样后点云 3.3数据对比 一、背景 在Open3D中,如果你想将点云随机采样到固定的点数,可以使用random_down_sample 函数并计算相应的采样比例。以下是如何实现…

MySQL数据库(五):事务

MySQL数据库中的事务是一种用来保证一系列操作要么全部成功,要么全部取消的机制。想象一下你去超市购物,拿了很多商品,如果中途发现没带钱包,你可以放弃这次购买,所有商品会回到原位。通过事务,可以确保数据…

感恩父爱 健康同行 宁夏康源父亲节特惠普查

父亲,是那道坚实的屏障,为孩子们挡风遮雨。父亲,是那颗明亮的灯塔,为孩子们指明前进的方向。然而岁月无情,随着年龄的增长,曾经为我们遮风挡雨的父亲如今也逐渐进入了各种疾病的高发期。感恩父爱&#xff0…

linux下进度条的实现

一、代码一版 使用模块化编程 1.processbar.h #include<stdio.h> #define capacity 101 //常量使用宏定义 #define style //符号方便后续修改 extern void processbar();修饰变量的时候一定要带extern&#xff0c;修饰函数的时候可以省略&#xff0c;因为没有函数体就…

FLASH仿真EEPROM---基于智芯Z20K11XM

一、介绍 电可擦和可编程只读存储器(EEPROM)可以对字节或字编程和擦除。EEPROM中的数据即使断电也能保持&#xff0c;但Z20K1xx芯片不含EEPROM。然而&#xff0c;闪存可以通过EEPROM仿真软件来模拟EEPROM。Z20K1xx包含两个flash阵列。编程和擦除操作可以在一个数组上进行&#…

华为200人园区网有线和无线

实验描述&#xff1a; 1 内网有有线业务、内部无线、外部无线三种业误。 2 内网服务器配置静态IP&#xff0c;网关192.168.108.1。 3 sW1和R1之间使用v1an200 192.168.200.9/30 互联。 4 R2向运营商申请企业宽带并获得了1个固定公网IP&#xff1a; 200.1.1.1 子网掩码 255.255.…

双目相机测距原理

一、普通双目相机测距原理 普通双目相机具有如下特点&#xff1a;左右两个相机位于同一平面&#xff08;光轴平行&#xff09;&#xff0c;且相机参数&#xff08;焦距f&#xff09;一致。其原理图如下&#xff1a; 如图所示&#xff0c;P点为相应的物体位置&#xff0c;CL和C…

Java面试八股之JVM参数-XX:+UseCompressedOops的作用

JVM参数-XX:UseCompressedOops的作用 JVM参数-XX:UseCompressedOops的作用是启用对象指针压缩&#xff08;Ordinary Object Pointers compression&#xff09;。这一特性主要应用于64位的Java虚拟机中&#xff0c;目的是为了减少内存使用。在传统的64位系统中&#xff0c;对象…

分配自定义内存对齐的内存块的aligned_malloc实现分析

malloc一般使用当前平台默认的最大内存对齐数对齐内存&#xff0c;如MSVC在32bit下一般是8bit对齐&#xff1b;64位下则是16bit。这样对常规的数据来说没有问题。但如果我们自定义的内存对齐超出了这个范围&#xff0c;则不能直接使用malloc。当我们要分配一块具有特定内存对齐…

【乐吾乐2D可视化组态编辑器】图表动态显示

1. 添加数据 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 图表动态展示是指一个图表图元的数据属性&#xff08;一般是dataY&#xff09;绑定多个变量&#xff0c;建立通信后数据动态变化展示。 官网默认Echarts图表拖拽到画布中是已经添加了图元的da…

OpenAI CTO米拉·穆拉提谈未来:AI一年半后达到博士水平

人工智能&#xff08;AI&#xff09;领域近年来的发展迅猛&#xff0c;特别是在大语言模型&#xff08;LLM&#xff09;的进步上。最近&#xff0c;OpenAI的首席技术官&#xff08;CTO&#xff09;米拉穆拉提&#xff08;Mira Murati&#xff09;在达特茅斯学院的一次采访中&am…

【Linux】Linux基础开发工具(yum)

Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便…

​Python20 Numpy基础

NumPy&#xff08;Numerical Python&#xff09;是一个开源的Python库&#xff0c;广泛用于科学计算。它提供了一个高性能的多维数组对象&#xff0c;以及用于处理这些数组的工具和函数。NumPy是数据分析、机器学习、工程和科学研究中不可或缺的工具之一&#xff0c;因为它提供…

【数据结构与算法】最小生成树,Prim算法,Kruskal算法 详解

最小生成树的实际应用背景。 最节省经费的前提下&#xff0c;在n个城市之间建立通信联络网。 Kruskal算法&#xff08;基于并查集&#xff09; void init() {for (int i 1; i < n; i) {pre[i] i;} }ll root(ll a) {ll i a;while (pre[i] ! i) {i pre[i];}return i p…