当前位置: 首页 > news >正文

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、常用注解

相关文章:

  • TensorRT-LLM加速框架的基本使用
  • 数据库原理与安全复习笔记(未完待续)
  • 【Linux】使用 iptables 验证访问HDFS 所使用到的端口
  • 光纤通讯资料收集
  • java课程设计GUI学生信息管理系统
  • 爬虫阶段思考
  • 【Rust】——所有可能会用到模式的位置
  • Spring Cloud学习:如何实现Gateway 服务网关限流
  • ESP32 esp-idf esp-adf环境安装及.a库创建与编译
  • OpenCV颜色检测
  • 网络编程(六)TCP并发服务器
  • B3996 [洛谷 202406GESP 模拟 三级] 小洛的数字游戏
  • SpringMVC:拦截Mybatis的mapper
  • 如何设计高可用的淘客返利系统
  • Synchronized、volatile与ReentrantLock:比较这些同步机制在Java并发编程中的应用和区别
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • bearychat的java client
  • express如何解决request entity too large问题
  • leetcode386. Lexicographical Numbers
  • Mac转Windows的拯救指南
  • Spark学习笔记之相关记录
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 多线程事务回滚
  • 番外篇1:在Windows环境下安装JDK
  • 基于axios的vue插件,让http请求更简单
  • 记一次用 NodeJs 实现模拟登录的思路
  • 技术发展面试
  • 来,膜拜下android roadmap,强大的执行力
  • 力扣(LeetCode)21
  • 前端性能优化——回流与重绘
  • 思考 CSS 架构
  • 微信小程序开发问题汇总
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​VRRP 虚拟路由冗余协议(华为)
  • ###C语言程序设计-----C语言学习(6)#
  • (八十八)VFL语言初步 - 实现布局
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm码农论坛 毕业设计 231126
  • (离散数学)逻辑连接词
  • (算法设计与分析)第一章算法概述-习题
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)大型网站架构演变和知识体系
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)从 Java 代码到 Java 堆
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET delegate 委托 、 Event 事件
  • .net web项目 调用webService
  • .net 托管代码与非托管代码
  • .Net 知识杂记
  • .NET的微型Web框架 Nancy
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .net知识和学习方法系列(二十一)CLR-枚举