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

news2024/11/24 22:23:51

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

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

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

相关文章

QQ等级评估源码+软件

今天,我将和大家探讨一个与直播、撸礼物相关的主题,它涉及到的是一种特殊的软件及其源码——QQ等级评估工具。在我们的生活中,直播已经成为了一种越来越流行的娱乐方式。不论是音乐会、电子竞技,还是日常生活分享,你都…

使用AI技术实现语言练习

使用人工智能技术实现语言场景练习,可以有效地提高学习者的语言能力,包括口语、听力、阅读和写作。以下是一些常见的应用场景。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 口语练习 虚拟对话伙伴: 利用…

基于最优滑膜控制的永磁同步电机调速系统MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 最优滑模面的选取 假定系统初始位于滑模面上,可得: 通过设计c(t)使如下积分性能指标达到最小: T为到达滑模面的终值时间,求解方程: a为系统初始条件参数。设cmc(0)为c(t)变…

软件协同开发是一种通过团队合作来创建软件的开发方法

软件协同开发是一种通过团队合作来创建软件的开发方法。与传统的瀑布模型相比,软件协同开发强调团队成员之间的合作和沟通,以实现更高效的开发过程和更优质的软件产品。 在软件协同开发中,团队成员通过一系列工具和技术来协同工作。这些工具…

Ubuntu-22.04 安装Confulence

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

昇思25天学习打卡营第4天|onereal

今天学习的内容是:ResNet50迁移学习 以下内容拷贝至教程,实话实话看不懂,迷迷糊糊都运行jupyter里的代码。走完程序,训练生成了一些图片。 ResNet50迁移学习 在实际应用场景中,由于训练数据集不足,所以很少…

[MYSQL] MYSQL表的操作

前言 由图可以看出,表是库的一部分,所以有库才能使用表 show databases; 查看已有的库 create database db_name ; 创建库 使用 use bd_name 使用库,之后对标进行增删查改就只会操作这个库里的而不影响其他库 创建表 create table [if not exists] table_name( d…

vue的学习--day2

如有错误,烦请指正~ 目录 一、什么是单页面应用程序 二、使用工具:node.js 三、工具链 易错点 一、什么是单页面应用程序 多个组件(例如登录、注册等以vue结尾的都叫做组件)在一个页面显示,叫单页面应用…

如何用亚马逊合作伙伴网络快速上线跨境电商

目前跨境电商已成为行业发展主流,如何快速、低成本打造品牌海外独立站和智能客服营销中心、构建全链路跨境电商体系是出海电商商家都会遇到的难题。亚马逊云科技凭借与亚马逊电商平台易于集成的先天优势成为首选的电商解决方案平台。本文介绍了如何用亚马逊云科技平…

ONLYOFFICE8.1新版本桌面编辑器测评

什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器,支持编辑处理文本文档、电子表格、演示文稿、可填写的表单、PDF,可多人在线协作,支持 AI 集成。 该套件可在 Windows、Linux、Android 和 iOS上使用,包括网页…

【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】

前言: 💞💞大家好,我是书生♡,今天主要和大家分享一下Hive中常见的优化手段----数据采集!常见的Join 优化有哪几种!什么是Hive索引!数据怎么发生倾斜!什么是mapreduce的本…

2024年6月24日 (周一) 叶子游戏新闻

图吧工具箱: 全名图拉丁吧硬件检测工具箱,是开源、免费、绿色、纯净的硬件检测工具合集,专为图钉及所有DIY爱好者制作,包含常用硬件测试和检测工具,月工JS必备! 土豆录屏: 免费、无录制时长限制、无水印的录屏软件 高手在民间 粉丝玩家打造精美《黄金树幽影》巨大插画虽然不是专…

私接路由器导致部分终端(电脑、手机等)无法上网问题分析

目录 【1】私接路由器场景 【2】进行网络基本配置,模拟终端可以正常上网 【2.1】Http-Server配置 【2.2】ISP配置 【2.3】R-hefa配置 【2.4】Client1配置 【2.5】PC配置 【2.6】测试验证上网是否正常 【3】私接路由器后再测试验证公司内网各终端访问外网是…

Linux网络编程:套接字编程

1.Socket套接字编程 1.1.什么是socket套接字编程 Socket套接字编程 是一种基于网络层和传输层网络通信方式,它允许不同主机上的应用程序之间进行双向的数据通信。Socket是网络通信的基本构件,它提供了不同主机间的进程间通信端点的抽象。一个Socket就是…

【Python】已解决:TypeError: a bytes-like object is required, not ‘int’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:TypeError: a bytes-like object is required, not ‘int’ 一、分析问题背景 在使用Python进行文件操作或处理二进制数据时,开发者可能会遇到如下错…

Coldrage Dagger

剃刀高地【寒怒匕首 Coldrage Dagger】 2020.11.26.剃刀高地刷【寒怒匕首】-1_网络游戏热门视频 2020.11.26.剃刀高地刷【寒怒匕首】-2_网络游戏热门视频

讯飞星火企业智能体平台正式发布,打造每个岗位专属AI助手

大力财经 | 发布 讯飞星火V4.0来了!6月27日,科大讯飞在北京发布讯飞星火大模型V4.0及相关落地应用。讯飞星火V4.0七大核心能力全面提升,整体超越GPT-4 Turbo,在8个国际主流测试集中排名第一,国内大模型全面领先。 大模…

08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数

08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数 0. 引言1. 关于m_line2. 关于m_quiver3. 关于m_text4. 关于m_plot5. 结语 0. 引言 本篇介绍下m_map中添加绘制基础线(m_line、m_plot)、绘制箭头(m_quiver&#x…

Gradle学习-3 Gradle插件

1、Gredle插件是什么 Gradle插件是用于扩展和增强Gradle构建系统的功能模块通过插件,Gradle可以执行各种构建任务,如编译代码、打包应用、运行测试等 Gradle插件主要分为:二进制插件、脚本插件 二进制插件二进制插件是预编译的、可以复用的…

代码随想录-Day42

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…