手写Spring第三篇,原来Spring容器是使用反射来初始化对象的

上次是不是你小子和大家说你拿来做登记的样品被我收了,然后取豆子的时候就是这个样品的?
今天我来辟一下谣,真的是这样的。这小子的样品确实被我收了,不过这小子没给真东西给我,只给了一个指针,害我宝贝得存起来了。结果真东西在我干爹JVM那里。

image.png

这不,今天趁着辟谣。我给大家公布一个好消息,我家工厂马上有生产线了,大家可以多来走走。上次我家工厂被吐槽主要有3个点:

  1. 登记的时候那个死鬼登记员说没样品不行
  2. 登记和取豆子在一个窗口,根本排不过来(虽然没人用)
  3. 没有生产线

今天咱们来一次性解决掉,首先是登记要样品问题,我一个 ctrl-c 一个 ctrl-v 就把这问题解决了。用这个就不用拿样品来了,直接和我说要什么豆子,下次来取我直接给你一个好的豆子。完美!

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

然后是第二个问题,登记和取豆子在一个窗口,根本排不过来。虽然这个问题是我臆想的,但是确实是客观存在的(我到底在说什么?我自己都看不懂了,怎么局里局气的)

image.png

这次取豆子一个窗口,登记一个窗口,再弄一个存豆子的窗口给办事员用。这下你没话说了吧?
我这窗口比豆子都多了。

// 取豆子的窗口
public interface BeanFactory {  Object getBean(String name);  
}// 登记窗口
public interface BeanDefinitionRegistry {  void register(String beanName, BeanDefinition beanDefinition);  
}// 单例豆子窗口,只选优良品种。例如歪瓜和裂枣
public interface SingletonBeanRegistry {Object getSingletonBean(String beanName);  
}

再招3个办事员来管3个窗口就O了。

// 单例豆子窗口办事员,这种事情要心腹才行,不然选不到歪瓜裂枣
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {  Map<String, Object> singletonBeanMap = new HashMap<>();  @Override  public Object getSingletonBean(String beanName) {  return singletonBeanMap.get(beanName);  }  protected void register(String beanName, Object bean){  singletonBeanMap.put(beanName, bean);  }  
}

本来还想再招两个人的,但有个被卷怕的奋斗b来应该说他带一个团队,但只收一个人的工资来干活。我一听这种人肯定有问题,为了试验他,我决定把生产豆子和登记的窗口交给他。毕竟一个团队只给一份工资,打靶老板都是抵挡不住这种诱惑的。

这个奋斗B我叫他模板哥,模板哥以前曾因为老板不让他用模板方法模式愤而离职,后来找不到工作才成了奋斗B,当打靶老板的舔狗。专门带着一个团队干活但只收一份钱。

他说模板这一套他门清,不止写程序要用模板,连带团队抢活干也需要模板,第一步是抢别人工作,第二步是入职还要带团队加班,第三步是让人骂,第四步是让人砍。

image.png

他说这个程序是他见过最契合模板模式的,有人来取豆子的时候执行这几步就行了:

  1. 查一下以前生产过一样的豆子吗?有就直接把豆子给出去
  2. 没有就查一下登记记录,把对应的登记信息拿出来
  3. 拿登记信息去生产豆子,然后把豆子给出去
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {  @Override  public Object getBean(String name) {  Object singletonBean = super.getSingletonBean(name);  if (Objects.nonNull(singletonBean)) {  return singletonBean;  }  BeanDefinition beanDefinition = getBeanDefinition(name);  return createBean(name, beanDefinition);  }  protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeanException;  protected abstract Object createBean(String beanName, BeanDefinition beanDefinition) throws BeanException;  
}

image.png

团队的二把手我叫他二表弟,不是我的二表弟是模板哥的二表弟。二表弟平时在团队里有表格罩着,经常是干一些别人能看见但又不难的活。这次他就负责生产豆子,然后把豆子放到单例豆子窗口去就完事了。

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {  @Override  protected Object createBean(String beanName, BeanDefinition beanDefinition) {  Object instance;  try {  instance = beanDefinition.getBeanClass().newInstance();  } catch (Exception e) {  throw new BeanException("Cannot instantiation a bean: " + beanDefinition.getBeanClass().getName());  }  super.register(beanName, instance);  return instance;  }  
}

image.png

团队干活的是大杂烩,他啥都想插一手,啥都想露脸,是模板哥的得力助手。模板哥和大表弟会的他全都会,都是一个团队的,继承一下很正常吧。大杂烩因为能说回道,基本上工厂的事情交给他准没错。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {  private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();  @Override  protected BeanDefinition getBeanDefinition(String beanName) {  BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);  if (Objects.isNull(beanDefinition)) {  throw new BeanException("Cannot found this bean name: " + beanName); }  return beanDefinition;  }  @Override  public void register(String beanName, BeanDefinition beanDefinition) {  beanDefinitionMap.put(beanName, beanDefinition);  }  
}

image.png

团队最后还有一个背锅侠,他平时不干活,出事了就找他。他的口头禅就是:那有什么办法呢?我丢

public class BeanException extends RuntimeException {  public BeanException(String message) {  super(message);  }  
}

我们工厂现在人丁兴旺,得整个关系图才行啊。我怕你们来我工厂的时候认不清人,不知道找谁你就找大杂烩。

image.png

现在来我家工厂就是这样的流程了

public class BeanFactoryTest {  @Test  public void test() {  // 大杂烩把工厂准备好  DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();  // 登记  BeanDefinition beanDefinition = new BeanDefinition(SuperMungBean.class);  defaultListableBeanFactory.register("superMungBean", beanDefinition);  // 取豆子  SuperMungBean service = (SuperMungBean) defaultListableBeanFactory.getBean("superMungBean");  // 测试看看豆子好不好吃  service.test();  }  
}public class SuperMungBean {  public SuperMungBean() {  }  public void test() {  System.out.println("超级绿豆那必须好吃啊");  }  
}

超级绿豆那必须好吃啊

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

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

相关文章

利士策分享,财富与肥胖:一场关于生活方式的深度对话

利士策分享&#xff0c;财富与肥胖&#xff1a;一场关于生活方式的深度对话 在这个物质充裕、信息爆炸的时代&#xff0c;我们不禁会思考起一些看似不相关实则微妙相连的社会现象&#xff0c; 比如财富与肥胖之间的关系。 这不仅仅是一个关于体重增减的简单议题&#xff0c;更…

自动驾驶中的决策规划技术分享--轻舟智航

文章目录 0.概述&#xff1a;1 导航模块2 决策模块2.1 车道决策2.2 障碍物决策 3 轨迹规划3.1 时空分离规划3.2 时空联合规划 4 对比 0.概述&#xff1a; 李仁杰&#xff0c;轻舟智航规划算法负责人&#xff0c;自动驾驶决策与规划技术专家。 在自动驾驶系统中&#xff0c;决策…

基于SSM的宿舍管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的宿舍管理系统9拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;宿舍管理、学生管理、水电费管理、报修管理、访客管理、各种信息统计报表 用户&#xff1a;个人信息管…

python mysql pymysql 数据库操作,常用脚本,个人小工具

起因&#xff0c; 目的: 整理 mysql 工具 启动数据库 检查服务器是否启动了: Get-Service -Name ‘mysql*’ 如果没启动的话&#xff0c;那么就启动: net start MySQL80 (最好是开启管理员权限) 1, 日常最常用的&#xff0c;创建连接 --> 查看所有数据库 —> 查看所有…

Docker 部署 sqlserver数据库,并且还原bak文件,使用MSSM 连接 sqlserver

文章目录 1 docker 安装mssql2 使用MSSM连接sqlserver3 还原bak文件 1 docker 安装mssql 拉取镜像 docker pull mcr.microsoft.com/mssql/server:2019-latest运行镜像生成容器 docker run -e "ACCEPT_EULAY" -e "MSSQL_SA_PASSWORDYourPassword123" -p 143…

CSS入门笔记

目录 概述 组成 CSS 语法 常见的使用方式 CSS 优先级 CSS 选择器 1. 基本选择器 2. 属性选择器 3. 伪类选择器 4. 组合选择器 示例 优先级 边框样式与盒子模型 单个边框 边框轮廓&#xff08;Outline&#xff09; 盒子模型 模型介绍 边距设置 布局示例 文…

一个基于VB的期刊信息管理系统

一个基本的期刊信息管理系统的示例&#xff0c;使用 Visual Basic (VB.NET) 编写。这个示例将展示如何创建一个简单的期刊信息管理系统&#xff0c;其中包括添加、查看、编辑和删除期刊的功能。 系统需求 添加期刊&#xff1a;允许用户输入期刊的信息&#xff08;如标题、作者…

如何使用 maxwell 同步到 redis?

文章目录 1、MaxwellListener2、MxwObject1. 使用Maxwell捕获MySQL变更2. 将Maxwell的输出连接到消息系统3. 从消息系统读取数据并同步到Redis注意事项 1、MaxwellListener package com.atguigu.tingshu.album.listener;import com.alibaba.fastjson.JSON; import org.apache.…

文心一言 VS 讯飞星火 VS chatgpt (350)-- 算法导论24.1 1题

一、在图 24-4上运行Bellman-Ford算法&#xff0c;使用结点 z z z作为源结点。在每一遍松弛过程中&#xff0c;以图中相同的次序对每条边进行松弛&#xff0c;给出每遍松弛操作后的 d d d值和 π π π值。然后&#xff0c;把边 ( z , x ) (z,x) (z,x)的权重改为 4 4 4&#xf…

傅里叶变换的基本性质和有关定理

一、傅里叶变换的基本性质 1.1 线性性质 若 则 其中:a,b是常数 函数线性组合的傅里叶变换等于歌函数傅里叶变换的相应组合。 1.2 对称性 若 则 关于傅里叶变换的对称性还有 虚、实、奇、偶函数的傅里叶变换性质: 1.3 迭次傅里叶变换 对f(x,y)连续两次做二维傅里叶变换…

Datawhile 组队学习Tiny-universe Task01

Task01&#xff1a;LLama3模型讲解 仓库链接&#xff1a;GitHub - datawhalechina/tiny-universe: 《大模型白盒子构建指南》&#xff1a;一个全手搓的Tiny-Universe 参考博客&#xff1a;LLaMA的解读与其微调(含LLaMA 2)&#xff1a;Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子…

前端框架对比和选择

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 前端框架选择是前端开发中的关键决策&#xff0c;因为它影响项目的开发效率、维护成本和可扩展性。当前&#xff0c;最流行的前端框架主要包括 React、Vue 和 Angular。它们各有优劣&#xff0c;适用于不同…

msvcp140.dll丢失如何解决?msvcp140.dll丢失的多种解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;当我们遇到msvcp140.dll丢失的情况时&#xff0c;应该如何解决呢&a…

【HTTP】HTTP报文格式和抓包

文章目录 HTTP 是什么HTTP 报文格式抓包工具抓包工具的原理抓包结果请求响应 IP&#xff0c;数据链路层&#xff0c;DNS… 都是理论为主&#xff0c;TCP/UDP 虽然有一些时间&#xff0c;但课堂内容不多 HTTP 理论和实践同样重要&#xff0c;未来作为 web 开发程序猿&#xff0…

机房监控运维工作的全面优化:以监控易一体化运维软件为助力

在当今高度信息化的社会&#xff0c;数据中心的运维工作显得尤为重要。为了确保机房环境的稳定、服务器和存储设备的正常运行、操作系统和数据库的持续高效&#xff0c;以及中间件服务的可靠性&#xff0c;运维团队需要执行一系列精细化的管理和操作。本文将以监控易一体化运维…

扩展------SpringBoot的自动装配机制+自定义一个Starter

SpringBoot的自动装配机制 SpringBoot提供给我们只要将框架的依赖包引入pom文件中&#xff0c;就可以帮助我们自动配置好&#xff0c;我们开箱即用&#xff0c;非常方便&#xff0c;底层原理是如何的呢&#xff1f; 首先自动装配依赖于EnableAutoConfiguration注解。 往下走&a…

PCIe扫盲(九)

系列文章目录 PCIe扫盲&#xff08;一&#xff09; PCIe扫盲&#xff08;二&#xff09; PCIe扫盲&#xff08;三&#xff09; PCIe扫盲&#xff08;四&#xff09; PCIe扫盲&#xff08;五&#xff09; PCIe扫盲&#xff08;六&#xff09; PCIe扫盲&#xff08;七&#xff09…

测试栏杆天线和金属圆管天线的差异

今天用网分测试了大约800mm的拉杆天线和800mm的金属圆管的s11的差异。 拉杆的最粗部分10mm,最细部分6mm。圆管的直径为均匀26mm。 两者的谐振频率在60Mhz左右。&#xff08;这也说明了谐振频率只要由长度决定&#xff09; 拉杆天线的swr 圆管的swr 注&#xff1a;上图因为网…

六个神级AI绘画技巧,让你的作品瞬间高级感爆棚!

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 在艺术的世界里&#xff0c;AI绘画正成为一…

网络原理(4)——网络层(IP)、数据链路层

1. IP 协议 基本概念&#xff1a; 主机&#xff1a;配有 IP 地址&#xff0c;但是不进行路由控制的设备 路由器&#xff1a;即配有 IP 地址&#xff0c;又能进行路由控制 节点&#xff1a;主机和路由器的统称 IP 协议报头格式 1) 4 位版本&#xff1a;实际上只有两个取值&…