Spring源码学习-12(基于xml的ioc源码解析)
步骤
在源码项目中编写如下代码,并打下如下断点
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);
}
在终点处打断点
栈区追踪
main:26, Entrance
代码如下,完成ioc并生成容器
:85, FileSystemXmlApplicationContext
可以看出由上一个函数传入的xml配置路径完成FileSystemXmlApplicationContext的初始化
:142, FileSystemXmlApplicationContext
如下图,通过构造函数的互相调用,可以主要做的是setConfigLocations(configLocations);
即给configLocations数组添加多个xml配置路径。之后refresh();
beanFactory的初始化以及初始化刷新工作。
refresh:541, AbstractApplicationContext
可以看到由上一步调用refresh方法最终创建内部容器beanfactory。
obtainFreshBeanFactory:670, AbstractApplicationContext
查看obtainFreshBeanFactory的调用,可以看到如下两步,其中refreshBeanFactory();
刷新容器,getBeanFactory
返回bean容器。
refreshBeanFactory:133, AbstractRefreshableApplicationContext
继续查看refreshBeanFactory的定义,可以看到改函数会判断容器是否存在完成容器销毁再建的操作。在创建新容器时候会有一步加载bean的操作即loadBeanDefinitions(beanFactory);
loadBeanDefinitions:94, AbstractXmlApplicationContext
查看loadBeanDefinitions
定义,可以看到该方法通过beanFactory
创建一个beanDefinitionReader
此后便由其完成bean的加载。在代码最末尾有执行了一个函数loadBeanDefinitions(beanDefinitionReader);
会将beanDefinitionReader传入。
loadBeanDefinitions:128, AbstractXmlApplicationContext
查看该处定义可以看到,这个函数即讲之前的config数组遍历出来再通过reader完成加载bean。
loadBeanDefinitions:257, AbstractBeanDefinitionReader
查看该方法定义,由之前调用出传入配置xml数组,完成bean加载并返回加载的数量。继续查看count += loadBeanDefinitions(location);
的定义
loadBeanDefinitions:195, AbstractBeanDefinitionReader
这一步只负责传入xml路径,继续前进
loadBeanDefinitions:224, AbstractBeanDefinitionReader
可以看出上一步传入xml路径,而这一步则是通过ResourcePatternResolver
完成资源加载生成Resource数组,再进行bean加载
loadBeanDefinitions:188, AbstractBeanDefinitionReader
如下代码传入,resource解析bean
loadBeanDefinitions:305, XmlBeanDefinitionReader
如下代码,将resource资源encoding之后再加载bean
loadBeanDefinitions:343,XmlBeanDefinitionReader
查看这一步即从resource中获取输入留将其传入下一个工作函数进行bean加载。
doLoadBeanDefinitions:408, XmlBeanDefinitionReader
可以看出这一步完成了InputSource+resource创建document对象加载。开始进行bean注册。
registerBeanDefinitions:531, XmlBeanDefinitionReader
可以看出,这一步完成了通过doc以及通过resource创建reader容器进行bean注册
registerBeanDefinitions:96, DefaultBeanDefinitionDocumentReader
如下图,传入doc节点,继续调用执行bean注册
doRegisterBeanDefinitions:155, DefaultBeanDefinitionDocumentReader
如下图,开始解析bean
parseBeanDefinitions:190, DefaultBeanDefinitionDocumentReader
如下图,遍历xml的节点进行解析bean
parseDefaultElement:218, DefaultBeanDefinitionDocumentReader
如下图,传入节点解析bean
processBeanDefinition:356, DefaultBeanDefinitionDocumentReader
向容器中注册解析的bean封装为bdHolder并向ioc容器中注册
registerBeanDefinition:166, BeanDefinitionReaderUtils
如下图,注册bean
registerBeanDefinition:912, DefaultListableBeanFactory
如下图,注册bean即将bean存入beanDefinitionMap容器中
本文地址:https://blog.csdn.net/shark_chili3007/article/details/112254425
推荐阅读
-
jsp基于XML实现用户登录与注册的实例解析(附源码)
-
spring源码深度解析— IOC 之 开启 bean 的加载
-
Spring学习笔记第二天,Spring基于xml或注解的IOC以及IOC的案例
-
Spring源码学习【六】AOP原理解析(一)代理对象的生成
-
Spring源码学习-12(基于xml的ioc源码解析)
-
spring源码深度解析— IOC 之 bean 的初始化
-
【SSH进阶之路】Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)
-
【SSH进阶之路】Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)
-
基于Spring注解的上下文初始化过程源码解析(二)
-
基于Spring注解的上下文初始化过程源码解析(一)