Spring : XML配置 JavaBean

news2024/11/24 15:46:01

文章目录

  • 前言
  • 一、xml 加载 Bean 对象
    • 总结XML加载Bean对象


前言

跟着大佬走!!!! https://github.com/DerekYRC/mini-spring

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、xml 加载 Bean 对象

大家先了解一下这个图,是作者给的定义

在这里插入图片描述

正片开始

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:factory-bean.xml"); 获取一个应用程序上下文对象,里面加载了xml 文件,最后将 xml 文件的对象取出,这里对应我们刚开始学 Spring 使用 xml 配置bean 对象。

在这里插入图片描述
在这里插入图片描述

接下来我们一步步 deBug 深入大佬源码。我会先上图再给注释,上图下描述,DeBug 走起。

在这里插入图片描述

在这里插入图片描述

先来到集成图的最下面 ClassPathXmlApplicationContext ,这里调用有参构造 ClassPathXmlApplicationContext 传入了xml文件名,然后把 classpath:factory-bean.xml 转换成了一个 String 数组,扔给了另一个重载的 有参构造。

在这里插入图片描述

到了个有参构造,把 configLocations 文件名数组,赋值给了全局变量 this.configLocations (也是一个字符串数组)。然后会调用 refresh( ) 方法,

在这里插入图片描述
在这里插入图片描述

refresh( ) 会来到 AbstractApplicationContext , 会先调用 refreshBeanFactory() 方法刷新 bean 工厂,所有会去到子类。

在这里插入图片描述
在这里插入图片描述

来到子类 AbstractRefreshableApplicationContext 的 refreshBeanFactory() 方法, 会先调用 createBeanFactory(); 创建默认的 bean 工厂,然后将 工厂扔给了 loadBeanDefinitions(beanFactory); 方法,加载 bean定义。

DefaultListableBeanFactory beanFactory = createBeanFactory(); 调用本类方法,创建默认的 bean 工厂

在这里插入图片描述

return new DefaultListableBeanFactory(); 会来到 DefaultSingletonBeanRegistry

在这里插入图片描述
在这里插入图片描述

由于 DefaultListableBeanFactory 集成了三个类,这里要对继承的类进行初始化操作,子类初始化,要先将父类进行加载。

在这里插入图片描述

拥有了默认的 bean 工厂后,将工厂扔给 本类的 loadBeanDefinitions(beanFactory); ,但是这是一个抽象方法,还是要到子类进行查看。

在这里插入图片描述

值得我们注意的是,这个方法还是抽象方法,由子类进行实现。我们还要跟着去子类,但是这一跟就会回到一开始 debug 的地方。

在这里插入图片描述在这里插入图片描述

XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory, this); 会去创建 一个 XmlBeanDefinitionReade 对象

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结XML加载Bean对象

首先我们先记住三个继承图在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

XML文件配置JavaBean要从一个 new ClassPathXmlApplicationContext("classpath:factory-bean.xml");开始读取XML文件。这个最终继承到 AbstractApplicationContext ,当我们传入xml文件时,会先将 文件名转换成一个数组,调用ClassPathXmlApplicationContext的重载方法,传入这个数组,然后依次加载父类,AbstractXmlApplicationContext, AbstractRefreshableApplicationContext, AbstractApplicationContext , DefaultResourceLoader, 初始化子类需要先加载父类,然后将文件数组赋值给成员变量 private String[] configLocations; 以便于后续获取这个文件名。

然后会调用 refresh(); 方法,这个方法会调用到 AbstractApplicationContext 的 refresh(); 方法 然后执行 refreshBeanFactory(); //创建BeanFactory,并加载BeanDefinition 但是这是个抽象方法 abstract ,需要到子类AbstractRefreshableApplicationContext去查看,就会到 AbstractRefreshableApplicationContext 对象的 refreshBeanFactory() 方法,会获取到一个 DefaultListableBeanFactory 对象, 默认的Bean工厂。

然后就是创建默认 Bean工厂(第二张继承图),这时由于 DefaultListableBeanFactory 还是最底层的类,初始化之前,还要去初始化父类,父类依次是 AbstractAutowireCapableBeanFactory, AbstractBeanFactory , DefaultSingletonBeanRegistry ,到 DefaultSingletonBeanRegistry 会依次加载 Spring 的三级缓存对于Spring的三级缓存,可自行搜索了解,和一个任意处理的 Bean容器 Map<String, DisposableBean> disposableBeans。然后一路返回到 DefaultListableBeanFactory 默认Bean工厂,返回的路上还会初始化父类的成员属性。
然后会调用 loadBeanDefinitions(beanFactory); 把这个默认的 bean工厂扔进去,很不巧的是,这个还是个抽象方法,就会到 AbstractRefreshableApplicationContext 的子类 AbstractXmlApplicationContext

来到 AbstractXmlApplicationContext 的 loadBeanDefinitions()方法,会得到一个 XmlBeanDefinitionReader 对象(第三张继承图),这个对象用来整个前两个继承图的两个体系,在 new XmlBeanDefinitionReader(beanFactory, this); 会传入两个参数,一个是默认的 bean工厂 DefaultListableBeanFactory , this 是谁调用就是谁,我们是从 ClassPathXmlApplicationContext 进来的,所以这个 this是ClassPAC ,这样就把两个继承体系整合在了一起。然后调用 getConfigLocations() 方法获取文件名,很不巧这个方法仍然是抽象方法,会去到子类 ClassPathXmlApplicationContext 正是我们一开始 DeBUG 的地方,设计的非常巧妙。

然后调用 XmlBeanDefinitionReader . loadBeanDefinitions(xml文件名 ) 方法, Xmlbean定义读取器加载 xml 文件,然后调用到父类 AbstractBeanDefinitionReader 的loadBeanDefinitions() 方法遍历出文件名。很不巧的是 loadBeanDefinitions 是重载方法,会再次重载到 XmlBeanDefinitionReader . loadBeanDefinitions( ) 这个地方重载的也非常妙。然后就是 getResourceLoader(); 之前 new XmlBeanDefinitionReader ,时传入了一个 ClassPathXmlApplicationContext 这个对象间接实现了 ResourceLoader,所以这里 getResourceLoader()会获取到 ClassPathXmlApplicationContext ;只不过这里使用 ResourceLoader 进行接收,然后调用 getResource (location文件名),后面会将这个文件名封装到一个 InputStream 读取xml 文件,然后调用 resource.getInputStream(); 获取到这个 InputStream 流。

最后到 doLoadBeanDefinitions(InputStream inputStream) 真正执行程序加载 xml 文件, //解析context:component-scan标签并扫描指定包中的类,提取类信息,组装成BeanDefinition , 标签属性 //id优先于name, //如果id和name都为空,将类名的第一个字母转为小写后作为bean的名称 , //beanName不能重名

//注册BeanDefinition
getRegistry().registerBeanDefinition(beanName, beanDefinition);

最后将解析xml 得到的 bean 放到 DefaultListableBeanFactory 默认bean工厂的 beanDefinitionMap 。

    private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();

	@Override
	public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
		beanDefinitionMap.put(beanName, beanDefinition);
	}

至此 XML 文件配置 Java Bean 结束

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

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

相关文章

【C语言】数组名作函数参数

数组名作函数参数 引例思考例2通用性指针形参和数组形参几点说明 引例 在主函数中输入10个整数&#xff0c;并存入一个一维数组中&#xff1b;然后在被调函数中&#xff0c;将0号元素的值改为原值的10倍&#xff1b;最后在主函数中输出结果。 思路&#xff1a; 若想在被调函数…

10:00进去,10:05就出来了,这问的也太变态了···

从外包出来&#xff0c;没想到死在另一家厂子了。 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到5月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推…

SSM框架-SpringMVC

1. SpringMVC 1.1 Spring与Web环境集成 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的&#xff0c;但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) &…

ActiveMq消息队列

ActiveMq是一种开源的java程序&#xff0c;支持Java消息服务(JMS) 1.1 版本 一、持久化机制 1、KahaDB&#xff1a;5.4及之后版本&#xff0c;默认使用日志文件 activemq.xml默认使用KahaDB持久化存储&#xff0c;默认配置安装路径data目录下 <persistenceAdapter> …

Django框架之模板其他补充

本篇文章是对django框架模板内容的一些补充。包含注释、html转义和csrf内容。 目录 注释 单行注释 多行注释 HTML转义 Escape Safe Autoescape CSRF 防止csrf方式 表单中使用 ajax请求添加 注释 单行注释 语法&#xff1a;{# 注释内容 #} 示例&#xff1a; {# 注…

09 FPGA—利用状态机实现可乐售卖机(附代码)

1. 理论 FPGA 是并行执行的&#xff0c;如果我们想要处理具有前后顺序的事件&#xff0c;就需要引入状态机。举个例子&#xff0c;将人看成 FPGA ,我们可以在散步的时候听歌和聊天这是并行执行的&#xff0c;但一天的行程安排却是以时间段前后执行的。 状态机简写为 FSM&#…

java前后端分离有详细内容吗?

微服务架构java前后端分离都有哪些具体内容&#xff1f;目前&#xff0c;有不少客户朋友经常询问我们类似的问题。其实&#xff0c;在新的经济发展形势下&#xff0c;提质增效的低代码开发平台微服务架构早已成为不少新老客户的选择&#xff0c;它们不仅能提高办公协作效率&…

成为更优秀的项目经理:快速提升影响力的六大原则与独门秘笈

在很多公司的组织架构中&#xff0c;项目经理并不是一个常规的职能岗位&#xff0c;项目组是为了某个项目目标临时组建的团队&#xff01; 这就造成了PM一个很尴尬的处境&#xff0c;权、责、利不匹配&#xff0c;也就是有责无权&#xff1a;PM既要对项目目标的实现负责&#…

K8S内容分发网络之集群,nginx,负载均衡,防火墙

目录 第一章.实验架构需求 第二章.实验环境准备 2.1.节点准备 2.2.环境准备 2.3.在master&#xff0c;node01&#xff0c;node02上操作安装docker 2.4.所有节点安装kubeadm&#xff0c;kubelet和kubectl 2.5.部署K8S集群 2.6.在master节点操作 2.7.所有节点部署网络插件…

小白windows安装python(图文详解)

以下是在 Windows 操作系统上安装 Python 的详细步骤&#xff1a; 打开浏览器&#xff0c;进入 Python 官网&#xff08;https://www.python.org/&#xff09;。 点击“Downloads”&#xff0c;然后选择适合您的操作系统的 Python 版本。例如&#xff0c;如果您的操作系统是…

“Shell“firewall防火墙

文章目录 一.Firewalld防火墙1.1firewalld概述1.2Firewalld和iptables的关系1.3Firewalld和iptables的区别 二.Firewalld网络区域2.1区域介绍&#xff1a;2.2firewalld 区域的概念:2.3Firewalld数据处理流程2.4Firewalld检查数据包的源地址的规则&#xff1a; 三.Firewalld防火…

05 Android开机启动之SystemServer

Android开机启动之SystemServer(SS) 一、梳理SystemServer启动流程 从上面整个Android开机启动思维导图(android 5.0的启动组成图)中可以看到: SystemServer是从Zygote中启动的。 开机->bootloader->kernel->init->zygote->SystemServer 二、SystemServe…

【嵌入式烧录/刷写文件】-1.5-Fill填充Motorola S-record(S19/SREC/mot/SX)文件

案例背景(共8页精讲)&#xff1a;该篇将告诉你&#xff0c;如何对一个S19文件进行填充&#xff1a; 对“起始地址”和“结束地址”内的非连续的Block块&#xff0c;进行填充&#xff1b;自定义填充范围。 目录 1 为什么要“Fill填充” 2 使用Vector HexView工具“填充”S19…

阿里,变“小”了,也变强了

文 | 螳螂观察 作者 | 青月 小公司总想做大&#xff0c;但在如今快速变换的科技浪潮下&#xff0c;一些大企业却想“变小”。 3月28日&#xff0c;阿里巴巴宣布启动“16N”组织变革&#xff0c;这意味着未来具备条件的业务集团和业务公司&#xff0c;都可以独立融资和独立上…

一文带你了解MySQL之InnoDB 统计数据是如何收集的

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 我们前边唠叨查询成本的时候经常用到一些统计数据&#xff0c;比如通过show table status可以看到关于表的统计数据&#xff0c;通过show index可以看到关于索引的统计数据&#xff0c;那…

分享国内可用的免费ChatGPT网站_测评by杂草小生

参考的文章1&#xff1a;ChatGPT套壳网站汇总-5月21日更新_QQVQQ...的博客-CSDN博客 参考文章2&#xff1a;分享一个国内可用的免费ChatGPT网站_Aaron_Plus的博客-CSDN博客 ChatGPT是基于自然语言处理技术的聊天机器人&#xff0c;可以进行对话和提供相关信息。由于chatGPT不…

导入/导出 Postcat 格式文件,打通数据不再难

导入 Postcat 插件。 使用 导入功能有多个入口&#xff0c;你可以在 API 分组处点击加号导入 API&#xff1a; 也可以在点击设置&#xff0c;然后选择导入选项 导出 Postcat 插件 支持导出 Postcat JSON 文件。 使用 进入空间页面&#xff0c;可以看到导出功能&#xff0c;点…

XXL-SSO简要说明

一、介绍 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有”轻量级、分布式、跨域、CookieToken均支持、WebAPP均支持”等特性。现已开放源代码&#xff0c;开箱即用。 官方文档 二、集成 2.1、源码下载 下载地址 2.2、代码结构…

剪辑中如何保持画面连贯性,视频剪辑用什么软件比较好?

随着各种视频软件和平台的流行&#xff0c;越来越多的人更喜欢观看视频&#xff0c;还有很多人出于兴趣和爱好&#xff0c;想要制作自己的视频&#xff0c;那要如何剪辑才能制作更好的视频呢&#xff1f;有什么比较靠谱的视频剪辑软件呢&#xff1f; 视频剪辑中保持画面连贯性…

Redis分布式锁及Redisson的实现原理

Redis分布式锁 一。什么是分布式锁 在讨论分布式锁之前我们回顾一下一些单机锁&#xff0c;比如synchronized、Lock 等 锁的基本特性&#xff1a; 1.互斥性&#xff1a;同一时刻只能有一个节点访问共享资源&#xff0c;比如一个代码块&#xff0c;或者同一个订单同一时刻只…