手写简易版Spring IOC容器01【学习】

文章目录

  • BeanDefinition
    • beanDefinition类
  • 单例对象
    • 单例对象注册(SingletonBeanRegistry)
    • DefaultSingletonBeanRegistry
  • 模板方法 BeanFactory
    • BeanFactory接口
    • AbstractBeanFactory 抽象工厂模板 (getBean)
    • AbstractAutowireCapableBeanFactory (createBean 创建bean)
    • DefaultListableBeanFactory (getBeanDefinition) 获得bean定义

BeanDefinition

beanDefinition类

beanDefinition的作用主要是保存一个对象的类信息.

public class BeanDefinition {private Class beanClass;public BeanDefinition(Class beanClass){this.beanClass = beanClass;}public Class getBeanClass() {return beanClass;}public void setBeanClass(Class beanClass) {this.beanClass = beanClass;}
}

单例对象

单例对象注册(SingletonBeanRegistry)

public interface SingletonBeanRegistry {Object getSingleton(String beanName);
}

DefaultSingletonBeanRegistry

单例对象保存的具体类,存入到map中,同时拥有get add单例的方法

public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {private Map<String, Object> singletonObjects = new HashMap<>();@Overridepublic Object getSingleton(String beanName) {return singletonObjects.get(beanName);}protected void addSingleton(String beanName, Object singletonObject){singletonObjects.put(beanName, singletonObject);}}

模板方法 BeanFactory

BeanFactory接口

定义了一个bean工厂拥有的基本方法
其中第一个代表无参生成bean,第二个代表有参生成bean

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

AbstractBeanFactory 抽象工厂模板 (getBean)

继承单例 获得单例的全部方法,实现BeanFactory接口
然后定义模板方法和两个抽象方法让子类实现.

public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {@Overridepublic Object getBean(String name) throws BeansException {// 首先从单例对象的map中去获取.Object bean = getSingleton(name);if(bean != null) return bean;// 去执行子方法的逻辑获取beanDefinitionBeanDefinition beanDefinition = getBeanDefinition(name);return createBean(name,beanDefinition,null);}@Overridepublic Object getBean(String name, Object... args) {// 首先从单例对象的map中去获取.Object bean = getSingleton(name);if(bean != null) return bean;// 去执行子方法的逻辑获取beanDefinitionBeanDefinition beanDefinition = getBeanDefinition(name);return createBean(name,beanDefinition,args);}protected abstract BeanDefinition getBeanDefinition(String beanName);protected abstract Object createBean(String beanName,BeanDefinition beanDefinition,Object[] args) throws BeansException;
}

AbstractAutowireCapableBeanFactory (createBean 创建bean)

继承上一个抽象类实现其中模板定义的一个方法 (createBean)

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();@Overrideprotected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) throws BeansException {Object bean = null;try {bean = createBeanInstance(beanDefinition,beanName,args);}catch (Exception e){e.printStackTrace();}addSingleton(beanName,bean);return bean;}protected Object createBeanInstance(BeanDefinition beanDefinition, String beanName, Object[] args) throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {Constructor constructorToUse = null;Class<?> beanClass = beanDefinition.getBeanClass();Constructor<?>[] declaredConstructors = beanClass.getDeclaredConstructors();for (Constructor ctor : declaredConstructors) {if (null != args && ctor.getParameterTypes().length == args.length) {constructorToUse = ctor;break;}}return instantiationStrategy.instantiate(beanDefinition, beanName, constructorToUse, args);}
}

DefaultListableBeanFactory (getBeanDefinition) 获得bean定义

实现模板方法中bean定义的收集.

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();@Overridepublic BeanDefinition getBeanDefinition(String beanName) {BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);if (beanDefinition == null) throw new RuntimeException("发生了异常");return beanDefinition;}// 注册bean.@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {beanDefinitionMap.put(beanName, beanDefinition);}
}

在这里插入图片描述

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

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

相关文章

leetcode hot100_part30_二分查找

上次写博客已经一个月了&#xff0c;这段时间在做外卖项目&#xff0c;真的啥也没有就是个小玩具。 上次接触是在最长递增子序列的一个题解里&#xff0c;复习一下已经忘完了。如果我们在一个有序数组中进行查找某个target&#xff0c;一般肯定就是从小到大or从大到小遍历查找&…

【系统架构设计】数据库系统(二)

数据库系统&#xff08;二&#xff09; 数据库模式与范式数据库设计数据库设计的方法数据库设计的基本步骤 事务管理并发控制故障和恢复 备份与恢复分布式数据库系统数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库设计 数据库设计的方法 目前已有的数据库设计方法可分…

ti-iwr6843isk的level_sensing上位机开发

1.入门推荐视频 https://www.ixigua.com/home/558167761108780/?list_entrancesearch 2.关于TI官方实验的一些思考 1.仅使用&#xff0c;而不涉及开发的话&#xff0c;可以直接烧录mmwave_industrial_toolbox_**文件夹中各个实验的二进制驱动文件。 2.除了烧录驱动&#xf…

jenkins 插件版本冲突

一、Jenkins安装git parameter 插件重启后报错与临时解决方案 cd /root/.jenkins cp config.xml config.xml.bak vim config.xml <authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAcces…

Step-DPO 论文——数学大语言模型理解

论文题目&#xff1a;STEP-DPO: STEP-WISE PREFERENCE OPTIMIZATION FOR LONG-CHAIN REASONING OF LLMS 翻译为中文就是&#xff1a;“LLMs长链推理的逐步偏好优化” 论文由港中文贾佳亚团队推出&#xff0c;基于推理步骤的大模型优化策略&#xff0c;能够像老师教学生一样优…

深入理解计算机系统 CSAPP 家庭作业10.9

if (Fork() 0) {dup2(STDIN_FILENO, atoi(argv[1]));Execve("fstatcheck", argv, envp); }

vue使用了代理跨域,部署上线,使用Nginx配置出现问题,访问不到后端接口

1、如果路由的mode是history模式的要加上框框里的哪句&#xff0c;然后配置下面的location router location / {root /usr/local/app/dist/; #vue文件dist的完整路径try_files $uri $uri/ router;index index.html index.htm;}#error_page 500 502 503 504 /50x.html;lo…

Alpine Linux 轻量级Linux 适合于 docker 容器镜像

Alpine Linux是创始于2010年4月及以前的、一款开源社区开发的、基于musl libc和BusyBox的轻量级Linux发行版&#xff1b;适合用来做路由器、防火墙、VPNs、VoIP 盒子以及服务器的操作系统。 Alpine 的意思是“高山的”。Alpine Linux 围绕 musl libc 和 busybox 构建。这使得它…

GaussianPro使用笔记

1. 介绍 GaussianPro: 3D Gaussian Splatting with Progressive Propagation 3D高斯分布(3DGS)最近以其高保真度和效率彻底改变了神经渲染领域。然而&#xff0c;3DGS在很大程度上依赖于运动结构&#xff08;SfM&#xff09;技术生成的初始化点云。当处理不可避免地包含无纹理…

顺序表<数据结构 C版>

目录 线性表 顺序表 动态顺序表类型 初始化 销毁 打印 检查空间是否充足&#xff08;扩容&#xff09; 尾部插入 头部插入 尾部删除 头部删除 指定位置插入 指定位置删除 查找数据 线性表 线性表是n个相同特性的数据元素组成的有限序列&#xff0c;其是一种广泛运…

算法 101 对称二叉树(Python)

需求 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 输出 class TreeNode:de…

Richtek立锜科技线性稳压器 (LDO) 选型

一、什么是LDO? LDO也可称为低压差线性稳压器&#xff0c;适合从较高的输入电压转换成较低输出电压的应用&#xff0c;这种应用的功率消耗通常不是很大&#xff0c;尤其适用于要求低杂讯、低电流和输入、输出电压差很小的应用环境。 二、LDO的特性 LDO透过控制线性区调整管…

C++ Eigen - 使用旋转矩阵,实现两个传感器之间的坐标变换(仅平移)

文章目录 1. 需求描述2. 需求分析3. 理论基础(来源于本人:实践中测试)4. 代码实现 1. 需求描述 设有三个坐标系&#xff1a;1系&#xff0c;m系&#xff0c;2系&#xff1b; 其中在1系下有坐标P’(1, 1, 0). 求该坐标在2系下的坐标值 P"&#xff1f; 手工分析肯定是&…

C/C++蓝屏整人代码

文章目录 &#x1f4d2;程序效果 &#x1f4d2;具体步骤 1.隐藏任务栏 2.调整cmd窗口大小 3.调整cmd窗口屏幕颜色 4.完整代码 &#x1f4d2;代码详解 &#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&a…

【西安活动邀请函】7月27 | PowerData 数字经济-“西安“开源行!

活动介绍 古有“长安回望绣成堆&#xff0c;山顶千门次第开”&#xff0c;西安&#xff0c;这座拥有深厚历史文化底蕴的古都&#xff0c;自古以来便是国家的重要战略中心。在漫长的历史进程中&#xff0c;西安不仅孕育了辉煌的文化&#xff0c;更在现代化进程中展现出了蓬勃的…

算法力扣刷题记录 五十一【654.最大二叉树】

前言 二叉树篇&#xff0c;继续。 记录 五十一【654.最大二叉树】 一、题目阅读 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。…

分享5款免费在线ps网页版工具,在线ps图片编辑器

在线PS&#xff0c;即在线Photoshop&#xff0c;是一种无需下载和安装即可在浏览器中使用的图片处理工具。这类工具通常提供与桌面版Photoshop相似的功能&#xff0c;包括但不限于图像编辑、调整、美化等。小编为大家收集整理了5款免费在线PS网页版工具&#xff0c;方便有需要的…

如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控

其实这篇文章没必要存在&#xff0c;教程太多了 参考博客&#xff08;1 2 3&#xff09;&#xff0c;如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 &#xff08;1&#xff09; 建议下载PuTTy for windows&#xff0c;从而建立与远程服务器的SSH连接 需要确认目标服…

实验六:频域图像增强方法

一、实验目的 熟练掌握频域滤波增强的各类滤波器的原理及实现。分析不同用途的滤波器对频域滤波增强效果的影响,并分析不同的滤波器截止频率对频域滤波增强效果的影响。二、实验原理 ① Butterworth 低通滤波器:一种具有最大平坦通带幅度响应的滤波器。它的特点是在通带内具…

JAVA面向对象03

基本类型的包装类 拆包–>封包 拆包–>包装类型转换基本数据类型 封包—>基本数据类型转换包装类型 编号基本数据类型包装类型1byteByte2shortShort3charCharacter4intInteger5longLonLong6floatFloat7doubleDouble8booleanBoolean 使用包装类型的原因 java是一…