首页 > 编程语言 > 详细

spring源码之xml解析与BeanDefinition的封装-obtainFreshBeanFactory()

时间:2021-07-26 09:21:23      阅读:45      评论:0      收藏:0      [点我收藏+]

spring容器加载核心方法refresh中obtainFreshBeanFactory()方法的解读

上一篇文章我们初窥了spring容器加载的整体流程,现在我们来细品其中的obtainFreshBeanFactory()方法,你找了个女朋友,不能只沉浸其外表,我们还得去了解一下其内在不是,得试试水到底有多深。首先在这个放上该方法整体流程图,这个流程图可花了俺两三个小时呢,希望对你有研读spring源码有帮助,还有不要被这个流程图给吓到啦,看完我对代码的分析你就会发现原来不过如此。

技术分享图片

1.进入AbstractApplicationContext类的obtainFreshBeanFactory()方法

技术分享图片

这里是一个典型模板方法设计模式,refershBeanFactory是一个protected abstract修饰的方法,让子类去完成具体的实现,我们去看子类AbstractRefreshableApplicationContext的refreshBeanFactory()方法

2.进入AbstractRefreshableApplicationContext的refershBeanFactory()方法

技术分享图片

3.进入AbstractXmlApplicationContext的loadBeanDefinitions()方法

技术分享图片

技术分享图片

4.进入AbstractBeanDefinitionReader的loadBeanDefnitions()方法

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片

5.进入XmlBeanDefinitionReader类的loadBeanDefinitions()方法

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片

6.进入DefaultBeanDefinitionDocumentReader类的registerBeanDefinitions()方法

技术分享图片

方法重载

技术分享图片

方法重载

技术分享图片

这个方法中获取根节点的子节点,如果是默认标签就进入parseDefaultElement()方法  eg.<bean id=" " class=" " />。如果是自定义标签则进入delegate.parseCustomeElement()方法,eg.<context:componet-scan base-backage=" "/>

7首先看默认标签解析方法

7.1进入parseDefaultElement()方法

方法重载

技术分享图片

方法重载
技术分享图片

7.2进入BeanDefinitionParserDelegate类的parseBeanDefinitionElement()方法

技术分享图片

方法重载
技术分享图片

方法重载,创建GenericBeanDefinition,然后完成各种子标签属性的解析,然后返回BeanDefiniton,spring实例化话只认识BeanDefinition

技术分享图片

 

8.自定义标签解析

8.1进入BeanDefinitionParserDelegate类的parseCustomElement()方法

技术分享图片

方法重载,下面这个方法是完成自定义标签解析的关键

技术分享图片

8.1.1首先获取namespaceuri

以扫描器为例

技术分享图片

8.1.2 resolve方法,进入DefaultNameSpaceHandlerResolver类的resolve()方法

技术分享图片

1.加载所有jar包META-INF/spring.handlers文件建立映射关系

技术分享图片

2.根据namespaceuri从映射关系找到NameSpaceHandler处理类

如果context标签就会找到ContextNameSpaceHandler.java

3.实例化
4.如context标签为例,调用ContextNameSpaceHandler的类init初始化方法,完成具体标签解析类的注册

技术分享图片

8.1.3调用parse方法完成解析,进入NameSpaceHandlerSupport类的parse方法

自定义标签处理类都继承自 NameSpaceHandlerSupport

技术分享图片

进入具体标签的处理类完成解析

技术分享图片

好啦,spring容器加载核心方法refresh中obtainFreshFactory方法暂告一段落,看到这里,想必对spring的xml解析及BeanDefinition的生成有了一定的了解,多少知道了点spring的深浅,而不是只趋于表面,关于注解扫描处理类ComponetScanBeanDefinitionParser具体的解析我们下篇文章再揭晓,如果你看得还比较舒服的话,那么请不要吝啬你的双手点个关注吧。

 

spring源码之xml解析与BeanDefinition的封装-obtainFreshBeanFactory()

原文:https://www.cnblogs.com/tanyf/p/15059249.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!