手写Spring系列【一】IOC的简单实现笔记

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:项目专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

🔥在这里说一下参考作者的博客地址:https://bugstack.cn 作者叫小傅哥,教程的名字叫《手撸Spring》,也算个版权声明以及宣传吧~

目录

  • 一源码目录和类关系
  • 二、简单的Bean定义 BeanDefinition
  • 三、定义单例注册接口
    • 3.1 SingletonBeanRegistry 接口
    • 3.2 DefaultSingletonBeanRegistry
  • 四、定义Bean 工厂 BeanFactory
    • 4.1 抽象类Bean工厂模板AbstractBeanFactory
    • 4.2 实例化Bean类(AbstractAutowireCapableBeanFactory)
  • 五、DefaultListableBeanFactory核心类实现
  • 六、总结

一源码目录和类关系

项目目录
在这里插入图片描述
类关系
在这里插入图片描述
详细关系图
在这里插入图片描述
查看原图===》 点此
接下来 我们就实现上面的类!!!

二、简单的Bean定义 BeanDefinition

BeanDefinition的实现类用于描述Spring中的一个应该被实例化的bean的各种性质,包括bean的属性值,构造函数,方法等等。在容器中,这些Bean的定义用BeanDefinition对象来表示,包含以下元数据: 1. 全限定类名, 通常是Bean的实际实现类; 2. Bean行为配置元素,它们 展开后包含了该bean所具有的各种属性、注入方式、销毁方式等等。

这里我们先实现简单的一个BeanDefinition

public class BeanDefinition {// 定义成 Class 这样就可以把 Bean 的实例化操作放到容器中处理了。private Class beanClass;public BeanDefinition(Class beanClass){this.beanClass = beanClass;}public Class getBeanClass() {return beanClass;}public void setBeanClass(Class beanClass){this.beanClass = beanClass;}
}

三、定义单例注册接口

3.1 SingletonBeanRegistry 接口

主要定义了一个获取单例对象的接口

public interface SingletonBeanRegistry {//得到 单例beanObject getSingleton(String beanName);
}

3.2 DefaultSingletonBeanRegistry

实现Object getSingleton(String beanName);的同时 自己还添加addSingleton() 方法
stringObjectMap 用来保存单例对象

public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {//容器 存放单例beanprivate Map<String,Object> stringObjectMap = new HashMap<>();@Overridepublic Object getSingleton(String beanName) {return stringObjectMap.get(beanName);}protected void addSingleton(String beanName , Object singletonObject){stringObjectMap.put(beanName,singletonObject);}
}

四、定义Bean 工厂 BeanFactory

public interface  BeanFactory {Object getBean(String name);
}

由 AbstractBeanFactory 抽象类实现接口的 getBean 方法
目前的 BeanFactory 仍然是非常简化的实现、后续笔记会逐步完善此类

4.1 抽象类Bean工厂模板AbstractBeanFactory

AbstractBeanFactory 抽象Bean工厂
此类 继承了 DefaultSingletonBeanRegistry 类 此类方法都实现了
实现了 BeanFactory 接口 实现getBean()方法来得到Bean
新增加了BeanDefinition()createBean()两个抽象方法

public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistryimplements BeanFactory {@Overridepublic Object getBean(String name) {//调用继承DefaultSingletonBeanRegistry实现的方法Object bean = getSingleton(name);if(bean != null){return bean;}BeanDefinition beanDefinition = getBeanDefinition(name);return createBean(name,beanDefinition);}protected abstract BeanDefinition getBeanDefinition(String beanName) ;protected abstract Object createBean(String beanName, BeanDefinition beanDefinition);}

getBean(String name):获取单例Bean
当第一次进入此方法 getSingleton(name);返回空 就会跳过 if 方法从而去创建 BeanDefinition对象然后由BeanDefinition的信息来创建Bean对象 当然此类并不实现这两个方法

4.2 实例化Bean类(AbstractAutowireCapableBeanFactory)

AbstractAutowireCapableBeanFactory 抽象自动装配Bean工厂 :创建对象
继承了 AbstractBeanFactory类 并实现 抽象方法createBean()
createBean() 根据beanDefinition来创建单例对象

public abstract class AbstractAutowireCapableBeanFactory extends  AbstractBeanFactory{@Overrideprotected Object createBean(String beanName, BeanDefinition beanDefinition) {Object bean = null;try{bean = beanDefinition.getBeanClass().newInstance();} catch (Exception e) {throw new RuntimeException(e);}//此方法是DefaultSingletonBeanRegistry中的 保存单例beanaddSingleton(beanName,bean);return bean;}
}

五、DefaultListableBeanFactory核心类实现

实现BeanDefinitionRegistry接口中的registerBeanDefinition() 把 一个BeanDefinition 对象保存至容器。
继承AbstractAutowireCapableBeanFactory 类 并实现 getBeanDefinition()此方法是 AbstractBeanFactory中定义的 用来得到一个BeanDefinition

public class DefaultListableBeanFactory extends  AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();@Overrideprotected BeanDefinition getBeanDefinition(String beanName) {BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);if (beanDefinition == null) throw new BeansException("No bean named '" + beanName + "' is defined");return beanDefinition;}@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {beanDefinitionMap.put(beanName, beanDefinition);}
}

六、总结

在这里插入图片描述

先把把 类信息 添加到 BeanDefinition
DefaultListableBeanFactory类是核心类 此类把我们的BeanDefinition注册到BeanDefinition对象池中
然后再 得到Bean对象(根据BeanDefinition的信息来创建bean)
bean对象实在第一次调用getBean()创建的

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

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

相关文章

大日志(大文件)查看工具

一款很不错的日志查看工具&#xff0c; 优势是能查看很大的日志文档。 无需安装&#xff0c;解压后运行即可&#xff1b; 有注册版&#xff0c;不注册也可以使用。 官方地址&#xff1a; LogViewer - Home page 一个下载地址&#xff1a; 日志查看工具UVviewsoft LogViewer(超大…

makefile编译举例

makefile编译举例 # 定义编译器和编译选项 CC gcc CFLAGS -Wall -Werror # 定义目标文件名 TARGET myprogram # 定义需要编译的源文件目录和文件名 SRC_DIR1 src1 SRC_DIR2 src2 OBJ_DIR1 obj1 OBJ_DIR2 obj2 SRC_FILES1 file1.c file2.c SRC_FILES2…

电脑如何查看是否支持虚拟化及如何开启虚拟化

什么是虚拟化? Intel Virtualization Technology就是以前众所周知的“Vanderpool”技术&#xff08;简称VT&#xff0c;中文译为虚拟化技术&#xff09;&#xff0c;这种技术可以让一个CPU工作起来就像多个CPU并行运行&#xff0c;从而使得在一部电脑内同时运行多个操作系统成…

MyBatis的xml里#{}的参数为null报错、将null作为参数传递报错问题

今天在调试的过程中发现一个bug&#xff0c;把传入的参数写到查询分析器中执行没有问题&#xff0c;但是在程序中执行就报错&#xff1a;org.springframework.jdbc.UncategorizedSQLException : Error setting null parameter. Most JDBC drivers require that the JdbcType m…

开山之作 | YOLOv1算法超详细解析(包括诞生背景+论文解析+技术原理等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测是计算机视觉领域的一项重要研究方向&#xff0c;它在许多应用领域中都得到了广泛应用&#xff0c;如人脸识别、物体识别、自动驾驶、视频监控等。在过去&#xff0c;目标检测方法主要采用基于RCNN、Fast R-CNN等深…

Python+Tkinter 图形化界面基础篇:集成数据库

PythonTkinter 图形化界面基础篇&#xff1a;集成数据库 引言为什么选择 SQLite 数据库&#xff1f;集成 SQLite 数据库的步骤示例&#xff1a;创建一个任务管理应用程序步骤1&#xff1a;导入必要的模块步骤2&#xff1a;创建主窗口和数据库连接步骤3&#xff1a;创建数据库表…

高级深入--day30

Scrapy Shell Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据。 如果安装了 IPython ,Scrapy终端将使用 IPython (替代标准Python终端)。 IPython 终端与其…

零基础学python之数据类型

文章目录 1、数据类型1.1 编程规范注释标识符命名规则命名规则python命名规则关于代码规范编程习惯的重要性 输入输出与变量输出输入变量 1.2 数值类型int(整型)浮点型&#xff08;float&#xff09;类型转化 1.3 字符串字符串创建字符串格式化**format**%s**f** 案例&#xff…

从零开始:深入理解Kubernetes架构及安装过程

K8s环境搭建 文章目录 K8s环境搭建集群类型安装方式环境规划克隆三台虚拟机系统环境配置集群搭建初始化集群&#xff08;仅在master节点&#xff09;配置环境变量&#xff08;仅在master节点&#xff09;工作节点加入集群&#xff08;knode1节点及knode2节点&#xff09;安装ca…

1806_emacs_org-mode归档的时候修改归档文件名称

全部学习汇总&#xff1a;GreyZhang/g_org: my learning trip for org-mode (github.com) 前面已经基本了解了org-mode的归档的规则或者方法&#xff0c;但是还有一点跟我现在的工作流有点不相符。我自己的工作流中会每月做一次工作的整理总结&#xff0c;因此归档的文件是按照…

KubeVela可持续测试应用部署之Mock基础设施

Mock接口是我们常用的功能测试方案,有时候依赖的接口未开发完成或者依赖的第三方接口不提供测试环境等,只有Mock才能跑通流程。 我们基于KubeVela开发的云原生应用交付平台,提供如初始化基础设施导入、中间件部署共用基础设施等相关能力的测试,需要依赖基础设施。虽然terr…

C++ PCL点云局部颜色变换

程序示例精选 C PCL点云局部颜色变换 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《C PCL点云局部颜色变换》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用…

基于SpringBoot的大学城水电管理系统

目录 前言 一、技术栈 二、系统功能介绍 管理员模块的实现 领用设备管理 消耗设备管理 设备申请管理 状态汇报管理 用户模块的实现 设备申请 状态汇报 用户反馈 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛…

Mysql 日常命令记录

索引操作 加联合组件&#xff1a; ALTER TABLE dws_stock_age_material_transactions_total_pri_rpt_update ADD INDEX index_sio (organization_id(16),item_code,subinventory_code); 查看索引&#xff1a; SHOW INDEX FROM dws_stock_age_material_transactions_detail_…

ETX 高性能远程桌面访问方案在医疗保健保健行业的应用案例

飞利浦医疗存在的挑战 1、对集成解决方案的多个系统进行远程访问连接&#xff1b; 2、医疗保健专业人员需要高质量的图形应用程序显示&#xff1b; 3、安全的远程访问&#xff0c;能够保护敏感数据和关键患者数据。 取得的成果 1、连接多个系统&#xff0c;以增强肿瘤治疗的交…

【SMOKE-CMAQ实践技术】10天,从小白-精通一站式技能提升

大气污染物排放是空气污染的源头&#xff0c;气象因素是影响污染程度的重要因素&#xff0c;因此空气质量模式要求气象资料和污染物排放清单作为输入&#xff0c;其中由于大气污染源复杂性、数据滞后性、动态变化、规律性不明显等特点&#xff0c;使得大气污染源排放清单输入准…

深度学习简述

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

点击劫持:X-Frame-Options 未配置

前言 X-Frame-Options作为HTTP头的一部分&#xff0c;是一种用于保护网站免受点击劫持攻击的安全措施。网站可以通过设置X-Frame-Options或csp报头来控制网站本身是否可以被嵌套到iframe中。 漏洞描述 Clickjacking&#xff08;点击劫持&#xff09;是一种安全漏洞&#xff…

Android 项目增加 res配置

main.res.srcDirs "src/main/res_test" build->android->sourceSets

简要归纳UE5 Lumen全局光照原理

一、Jim kajiya老爷子的渲染方程&#xff1a; 求全局光照就是求解渲染方程&#xff0c;我们将两边都有未知数的渲染方程变换成离散形式&#xff1a; 更形象的描述这个离散的渲染方程&#xff1a; 要给每个三角形着色就得先判断光线有没有和它相交&#xff0c;以下是求光线和三…