手写简易版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://www.mzph.cn/diannao/47922.shtml

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

相关文章

大根堆的实现和堆排序

//交换 public static void swap(int[] arr , int i , int j){arr[i] arr[i] ^arr[j];arr[j] arr[i] ^arr[j];arr[i] arr[i] ^arr[j]; } //大根堆 public static class MyMaxHeap{private int[] heap;private final int limit;private int heapSize;public MyMaxHeap(int limit…

北京邮电大学,中央空调的分户计费系统

北京邮电大学 中央空调如何公平、公正、合理的收取费用&#xff0c;一直都是各建筑管理者的首要问题。北京邮电大学也面临着能源分配不公&#xff0c;学校管理者空调收费管理困难等问题。根据学校的具体情况&#xff0c;拓森为其制定了一套中央空调管理运营方案—无线中央空调…

利用docker和docker-compose部署airflow

先决条件 内存需要至少有4GB 环境准备 部署安装docker sudo dnf install -y docker sudo systemctl enable docker --now sudo usermod -aG docker $USER newgrp docker exec bash 部署安装docker-compose # docker-compose (latest version) $-> sudo curl -L htt…

一个小问题导致,AI大模型集体翻车?

9.11大还是9.9大&#xff1f; 这两天大家都在说ChatGPT大模型翻车了 &#xff01; 这到底是怎么个事儿呢&#xff1f; 原来是最近有人想ChatGPT等大模型提了一个简单的问题&#xff1a; 9.11 大还是 9.9 大&#xff1f; 答案显而易见&#xff0c;然而众多大模型却给出了错误…

初学Linux之常见指令(下)

初学Linux之常见指令&#xff08;下&#xff09; 文章目录 初学Linux之常见指令&#xff08;下&#xff09;1. echo 指令2. cat 指令3. more 指令4. less 指令5. head 和 tail 指令6. date 指令7. cal 指令8. which 指令9. alias 指令10. find 指令11. grep 指令12. zip 和 unz…

vue排序

onEnd 函数示例&#xff0c;它假设 drag.value 是一个包含多个对象&#xff08;每个对象至少包含 orderNum 和 label 属性&#xff09;的数组&#xff0c;且您希望在拖动结束后更新所有元素的 orderNum 以反映新的顺序&#xff1a; function onEnd(e) { // 首先&#xff0c;确…

单链表<数据结构 C版>

目录 概念 链表的单个结点 链表的打印操作 新结点的申请 尾部插入 头部插入 尾部删除 头部删除 查找 在指定位置之前插入数据 在任意位置之后插入数据 测试运行一下&#xff1a; 删除pos结点 删除pos之后结点 销毁链表 概念 单链表是一种在物理存储结构上非连续、非顺序…

熵、交叉熵、KL散度

这里写目录标题 熵KL散度引入交叉熵。交叉熵的二分类公式&#xff1a; 再次理解SoftMax函数结束 熵 熵&#xff0c;是一个物理上的概念&#xff0c;表示一个系统的不确定性程度&#xff0c;或者表示一个系统的混乱程序。 下边是信息熵的演示&#xff1a; 信息熵的公式如下&…

Vue:axios请求数据转存leanCloud

思路&#xff1a; 采用axios请求需要的数据&#xff0c;查看leanCloud中数据批量存储的格式&#xff0c;将两个数据进行对比&#xff0c;将请求得到的数据封装为云服务存储的格式&#xff0c;再发leanCloud存储数据的请求完成转存 1.封装js代码 //批量操作新增数据 import r…

【计算机视觉前沿研究 热点 顶会】CVPR 2024中与域适应、分布外目标检测相关的论文

测试时间线性分布外检测 分布外&#xff08; OOD&#xff09;检测旨在通过在输入样本显著偏离训练分布&#xff08;分布中&#xff09;时触发警报来解决神经网络的过度置信度预测&#xff0c;这表明输出可能不可靠。当前的 OOD 检测方法探索各种线索来识别 OOD 数据&#xff0…

【Docker】Docker-compose 单机容器集群编排工具

目录 一.Docker-compose 概述 1.容器编排管理与传统的容器管理的区别 2.docker-compose 作用 3.docker-compose 本质 4.docker-compose 的三大概念 二.YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 三.Docker-compose …

MySQL简介以及对数据库的操作

一、什么是数据库 1.数据库&#xff08;Database&#xff0c;简称DB&#xff09;概念&#xff1a; 长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个 数据“仓库”。 2、数据库的特点 结构化&#xff1a;数据在数据库中的存储可以依靠二 维表…

鸿蒙语言基础类库:【@system.sensor (传感器)】

传感器 说明&#xff1a; 从API Version 8开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.sensor]。本模块首批接口从API version 4开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。该功能使用需要对应硬件支持&#xff0c;仅支持…

对象存储解决方案:高性能分布式对象存储系统MinIO

文章目录 引言I 自动化数据管理界面1.1 图形用户界面:GUI1.2 命令行界面:MinIO CLI1.3 应用程序编程接口:MinIO APIII 部署集成2.1 建议使用RPM或DEB安装方式2.2 创建环境变量文件2.3 启动MinIO服务2.4 将NGINX用作反向代理,配置负载。III 基础概念3.1 为什么是对象存储?3…

什么是信息指纹和信息加密——《数学之美》第16、17章以及其他各种资料的读书笔记

目录 1. 信息指纹 1.1 概念 1.2 相关算法的演进历程 1.3 哈希碰撞 1.4 雪崩效应 1.5 应用场景 2. 信息加密 2.1 密码学的简要历史 2.1.1 古代密码学&#xff1a;智慧的萌芽 2.1.2 中世纪至文艺复兴&#xff1a;密码术的兴起 2.1.3 近代密码学&#xff1a;机械密码机的…

CentOS配置时钟服务

一、ntp协议 1.1 基础 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是用于同步计算机网络中各个设备时间的协议。 下面了解一下 ntp 的配置选项 1.) iburst 功能: 通过发送一组八个数据包来加速初始同步。 用法: server 0.pool.ntp.org i…

惠海 15N10 LED灯驱动NMOS管-HC070N10L 100V15A 低内阻 TO-252封装 散热好

NMOS和PMOS管的工作原理&#xff1a; NMOS&#xff08;N型金属氧化物半导体&#xff09;和PMOS&#xff08;P型金属氧化物半导体&#xff09;是两种重要的晶体管。它们都由栅极&#xff08;gate&#xff09;、漏极&#xff08;drain&#xff09;和源极&#xff08;source&…

FastAPI 学习之路(五十)WebSockets(六)聊天室完善

我们这次只是对于之前的功能做下优化&#xff0c;顺便利用下之前的操作数据的接口&#xff0c;使用下数据库的练习。 在聊天里会有一个上线的概念。上线要通知大家&#xff0c;下线也要通知大家谁离开了&#xff0c;基于此功能我们完善下代码。 首先&#xff0c;我们的登录用…

SpringCloud------Sentinel(微服务保护)

目录 雪崩问题 处理方式!!!技术选型 Sentinel 启动命令使用步骤引入依赖配置控制台地址 访问微服务触发监控 限流规则------故障预防流控模式流控效果 FeignClient整合Sentinel线程隔离-------故障处理线程池隔离和信号量隔离​编辑 两种方式优缺点设置方式 熔断降级-----…

【MyBatis】Mybatis中的动态SQL——bind标签

目录 介绍用法语法使用小结 示例兼容不同数据库的语法差异分析 防止SQL注入分析 优缺点优点&#xff1a;缺点&#xff1a; 注意事项 介绍 在MyBatis中&#xff0c;标签用于绑定一个表达式的结果到一个变量上。它可以在SQL语句中使用绑定的变量&#xff0c;代替直接使用表达式。…