作者:justmoon999 | 来源:互联网 | 2023-06-13 16:20
spring容器加载核心方法refresh中obtainFreshBeanFactory()方法的解读上一篇文章我们初窥了spring容器加载的整体流程,现在我们来细品其中的obt
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.。如果是自定义标签则进入delegate.parseCustomeElement()方法,eg.
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具体的解析我们下篇文章再揭晓,如果你看得还比较舒服的话,那么请不要吝啬你的双手点个关注吧。