欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring源码学习-12(基于xml的ioc源码解析)

程序员文章站 2022-04-14 12:03:51
步骤在源码项目中编写如下代码,并打下如下断点public static void main(String[] args) {System.out.println("hello world");String xmlPath = "E:\\spring-framework-5.2.0.RELEASE\\springdemo\\src\\main\\resources\\spring\\spring-config.xml";ApplicationContext applicationCon...

步骤

在源码项目中编写如下代码,并打下如下断点

public static void main(String[] args) {

		System.out.println("hello world");
		String xmlPath = "E:\\spring-framework-5.2.0.RELEASE\\springdemo\\src\\main\\resources\\spring\\spring-config.xml";
		ApplicationContext applicationContext = new FileSystemXmlApplicationContext(xmlPath);
		WelcomeService welcomeService = (WelcomeService) applicationContext.getBean("welcomeService");
		welcomeService.sayHello("jack");

		//无参构造创建对象
		User user1a = (User) applicationContext.getBean("user1");
		User user1b = (User) applicationContext.getBean("user1");

	//静态工厂创建对象
		User user2a = (User) applicationContext.getBean("user2");
		User user2b = (User) applicationContext.getBean("user2");

		//实例工厂创建对象
		User user3a = (User) applicationContext.getBean("user3");
		User user3b = (User) applicationContext.getBean("user3");


		UserFactoryBean userFactoryBean = (UserFactoryBean) applicationContext.getBean("&userFactoryBean");
		User user4b = (User) applicationContext.getBean("userFactoryBean");

		System.out.println(user1a);
		System.out.println(user1b);

		System.out.println(user2a);
		System.out.println(user2b);

		System.out.println(user3a);
		System.out.println(user3b);


		System.out.println(userFactoryBean);
		System.out.println(user4b);


	}

在终点处打断点

Spring源码学习-12(基于xml的ioc源码解析)

栈区追踪

main:26, Entrance

代码如下,完成ioc并生成容器
Spring源码学习-12(基于xml的ioc源码解析)

:85, FileSystemXmlApplicationContext

可以看出由上一个函数传入的xml配置路径完成FileSystemXmlApplicationContext的初始化

Spring源码学习-12(基于xml的ioc源码解析)

:142, FileSystemXmlApplicationContext

如下图,通过构造函数的互相调用,可以主要做的是setConfigLocations(configLocations);即给configLocations数组添加多个xml配置路径。之后refresh();beanFactory的初始化以及初始化刷新工作。
Spring源码学习-12(基于xml的ioc源码解析)

refresh:541, AbstractApplicationContext

可以看到由上一步调用refresh方法最终创建内部容器beanfactory。
Spring源码学习-12(基于xml的ioc源码解析)

obtainFreshBeanFactory:670, AbstractApplicationContext

查看obtainFreshBeanFactory的调用,可以看到如下两步,其中refreshBeanFactory();刷新容器,getBeanFactory返回bean容器。
Spring源码学习-12(基于xml的ioc源码解析)

refreshBeanFactory:133, AbstractRefreshableApplicationContext

继续查看refreshBeanFactory的定义,可以看到改函数会判断容器是否存在完成容器销毁再建的操作。在创建新容器时候会有一步加载bean的操作即loadBeanDefinitions(beanFactory);

Spring源码学习-12(基于xml的ioc源码解析)

loadBeanDefinitions:94, AbstractXmlApplicationContext

查看loadBeanDefinitions定义,可以看到该方法通过beanFactory创建一个beanDefinitionReader此后便由其完成bean的加载。在代码最末尾有执行了一个函数loadBeanDefinitions(beanDefinitionReader);会将beanDefinitionReader传入。

Spring源码学习-12(基于xml的ioc源码解析)

loadBeanDefinitions:128, AbstractXmlApplicationContext

查看该处定义可以看到,这个函数即讲之前的config数组遍历出来再通过reader完成加载bean。

Spring源码学习-12(基于xml的ioc源码解析)

loadBeanDefinitions:257, AbstractBeanDefinitionReader

查看该方法定义,由之前调用出传入配置xml数组,完成bean加载并返回加载的数量。继续查看count += loadBeanDefinitions(location);的定义
Spring源码学习-12(基于xml的ioc源码解析)

loadBeanDefinitions:195, AbstractBeanDefinitionReader

这一步只负责传入xml路径,继续前进
Spring源码学习-12(基于xml的ioc源码解析)

loadBeanDefinitions:224, AbstractBeanDefinitionReader

可以看出上一步传入xml路径,而这一步则是通过ResourcePatternResolver完成资源加载生成Resource数组,再进行bean加载

Spring源码学习-12(基于xml的ioc源码解析)

loadBeanDefinitions:188, AbstractBeanDefinitionReader

如下代码传入,resource解析bean
Spring源码学习-12(基于xml的ioc源码解析)

loadBeanDefinitions:305, XmlBeanDefinitionReader

如下代码,将resource资源encoding之后再加载bean

Spring源码学习-12(基于xml的ioc源码解析)

loadBeanDefinitions:343,XmlBeanDefinitionReader

查看这一步即从resource中获取输入留将其传入下一个工作函数进行bean加载。

Spring源码学习-12(基于xml的ioc源码解析)

doLoadBeanDefinitions:408, XmlBeanDefinitionReader

可以看出这一步完成了InputSource+resource创建document对象加载。开始进行bean注册。

Spring源码学习-12(基于xml的ioc源码解析)

registerBeanDefinitions:531, XmlBeanDefinitionReader

可以看出,这一步完成了通过doc以及通过resource创建reader容器进行bean注册

Spring源码学习-12(基于xml的ioc源码解析)

registerBeanDefinitions:96, DefaultBeanDefinitionDocumentReader

如下图,传入doc节点,继续调用执行bean注册

Spring源码学习-12(基于xml的ioc源码解析)

doRegisterBeanDefinitions:155, DefaultBeanDefinitionDocumentReader

如下图,开始解析bean
Spring源码学习-12(基于xml的ioc源码解析)

parseBeanDefinitions:190, DefaultBeanDefinitionDocumentReader

如下图,遍历xml的节点进行解析bean

Spring源码学习-12(基于xml的ioc源码解析)

parseDefaultElement:218, DefaultBeanDefinitionDocumentReader

如下图,传入节点解析bean
Spring源码学习-12(基于xml的ioc源码解析)

processBeanDefinition:356, DefaultBeanDefinitionDocumentReader

向容器中注册解析的bean封装为bdHolder并向ioc容器中注册
Spring源码学习-12(基于xml的ioc源码解析)

registerBeanDefinition:166, BeanDefinitionReaderUtils

如下图,注册bean
Spring源码学习-12(基于xml的ioc源码解析)

registerBeanDefinition:912, DefaultListableBeanFactory

如下图,注册bean即将bean存入beanDefinitionMap容器中
Spring源码学习-12(基于xml的ioc源码解析)

本文地址:https://blog.csdn.net/shark_chili3007/article/details/112254425