手撕spring05(xml解析bean)

news/2025/3/15 4:55:38/

概述

通过加载配置文件的信息,注册xml的bean配置

整体设计

知识点补充

返回指定资源的输入流

// 相对路径获取流
java.lang.ClassLoader#getResourceAsStream
// 绝对路径获取流
java.io.FileInputStream#FileInputStream(java.io.File)
// URL获取流
java.net.URLConnection#getInputStream

类图

类图

核心类

DefaultSingletonBeanRegistry类的singletonObjects属性存放实例化后的bean
DefaultListableBeanFactory类主要存放的是beanDefinition信息,并继承AbstractAutowireCapableBeanFactory
AbstractAutowireCapableBeanFactory类的职责是管理beanDefinition的bean的初始化、实例化过程
XmlBeanDefinitionReader类主要是通过继承BeanDefinitionReader类去解析xml文件,并将xml文件的bean内容转换为对应的BeanDefinition,通过BeanDefinitionRegistry设置bean信息

时序图

  1. 初始化BeanFactory(DefaultListableBeanFactory)工厂
  2. 初始化XmlBeanDefinitionReader
    调用父类AbstractBeanDefinitionReader的构造方法
  3. 调用XmlBeanDefinitionReader的loadBeanDefinitions方法
<?xml version="1.0" encoding="UTF-8"?>
<beans><bean id="userDao" class="cn.bugstack.springframework.test.bean.UserDao"/><bean id="userService" class="cn.bugstack.springframework.test.bean.UserService"><property name="uId" value="10001"/><property name="userDao" ref="userDao"/></bean>
</beans>
	获取AbstractBeanDefinitionReader中的resourceLoader对象通过工厂、策略方法获取指定的Resource子类调用loadBeanDefinitions加载beanDefinitions得到IO流解析IO流,遍历childNodes通过NodeName为bean解析bean信息(id、name、class)获取beanName:id(优先级)>className(优先级)初始化beanDefinition通过xml中的配置设置beanDefinition属性,如果ref是空取value作为对象值初始化beanDefinition如果DefaultListableBeanFactory中的beanDefinitionMap有相同的beanName报错在BeanDefinitionRegistry接口中注册(流程如上几章节)

小结

主要分为两部分:解析配置文件,并将配置文件信息转换为对应BeanDefinition初始化beanDefinition(目前指定的是CgLib)通过beanDefinition的propertyValues去实例化初始化对象的属性

http://www.ppmy.cn/news/827339.html

相关文章

塔望3W消费战略-消费本位研究法:焦点座谈会(Focus Group)

消费主权时代&#xff0c;个性消费火热、消费主动性增强、消费心理稳定性减小、消费更新速度加快。消费者的消费需求越来越呈现出多层次和个性化特点&#xff0c;尤其是个性在消费心理的研究中占有越来越突出的地位。 消费者在购物时发生的一切心理活动&#xff0c;以及由此推…

DTC品牌如何冷启动?

2021年对于DTC品牌可谓是水深火热的一年&#xff0c;先是快时尚女装品牌Shein筹备IPO&#xff0c;估值暴涨至3000亿&#xff0c;再有PatPat宣布完成5.1亿美金C轮系列、D轮系列融资。虽然近期许多DTC品牌的势头不再强劲&#xff0c;但不可否认的是&#xff0c;DTC还是给大公司们…

Android Java代码与JNI交互字符串转换(四)

🔥 Android Studio 版本 🔥 🔥 创建JNIString.java 🔥 package com.cmake.ndk1.jni;public class JNIString {static{System.loadLibrary("string-lib");}public native String callNativeString(String str);public native void stringMethod(String str)…

LiangGaRy-学习笔记-Day29

1、SQL语句进阶 1.1、数据的导入 登入数据库 导入数据库 #登入数据库 [rootNode1 ~]# mysql -uroot -p123456#导入sql文件 [rootNode1 ~]# mysql -uroot -p123456 GAME </root/book_utf8.sql mysql: [Warning] Using a password on the command line interface can be…

2007年沪市上涨前20与后20

2008-1-11 代码 名称 2007 2006 2005 2004 2003 净资产收益率 1 600837 海通证券 898.55% 31.92% 16.56% 57.17% -3.08% 45.40% 2 600385 *ST金泰 761.06% 64.27% -8.93% -49.09% -61.72% 3 600158 中体产业 753.68% 138.27% -10.16% -2.92% -13.51% 4.28% 4 600595 中孚实…

UVM学习笔记--寄存器模型 Register Model

1.寄存器模型( Register model )简介 UVM的寄存器模型是一组高级抽象的类&#xff0c;用来对DUT中具有地址映射的寄存器和存储器进行建模。它非常贴切的反映DUT中寄存器的各种特性&#xff0c;可以产生激励作用于DUT并进行寄存器功能检查。通过UVM的寄存器模型&#xf…

货捕头API接口,item_search - 根据关键词取商品列表

点击获取key和secret测试 货捕头根据关键词取商品列表 API 返回值说明 --------------------------------------- Result Object: --------------------------------------- {"items": {"page": 1,"real_total_results": 6300,"total_re…

宣威民中2021年高考成绩查询,2021曲靖市地区高考成绩排名查询,曲靖市高考各高中成绩喜报榜单...

距离2018年高考还有不到一个月的时间了&#xff0c;很多人在准备最后冲刺的同时&#xff0c;也在关心高考成绩。2018各地区高考成绩排名查询,高考各高中成绩喜报榜单尚未公布&#xff0c;下面是往年各地区高考成绩排名查询,高考各高中成绩喜报榜单&#xff0c;想要了解同学可以…