上一篇文章我们初窥了spring容器加载的整体流程,现在我们来细品其中的obtainFreshBeanFactory()方法,你找了个女朋友,不能只沉浸其外表,我们还得去了解一下其内在不是,得试试水到底有多深。首先在这个放上该方法整体流程图,这个流程图可花了俺两三个小时呢,希望对你有研读spring源码有帮助,还有不要被这个流程图给吓到啦,看完我对代码的分析你就会发现原来不过如此。
这里是一个典型模板方法设计模式,refershBeanFactory是一个protected abstract修饰的方法,让子类去完成具体的实现,我们去看子类AbstractRefreshableApplicationContext的refreshBeanFactory()方法
方法重载
方法重载
方法重载
方法重载
方法重载
方法重载
方法重载
方法重载
这个方法中获取根节点的子节点,如果是默认标签就进入parseDefaultElement()方法 eg.<bean id=" " class=" " />。如果是自定义标签则进入delegate.parseCustomeElement()方法,eg.<context:componet-scan base-backage=" "/>
方法重载
方法重载
方法重载
方法重载,创建GenericBeanDefinition,然后完成各种子标签属性的解析,然后返回BeanDefiniton,spring实例化话只认识BeanDefinition
方法重载,下面这个方法是完成自定义标签解析的关键
以扫描器为例
如果context标签就会找到ContextNameSpaceHandler.java
自定义标签处理类都继承自 NameSpaceHandlerSupport
进入具体标签的处理类完成解析
好啦,spring容器加载核心方法refresh中obtainFreshFactory方法暂告一段落,看到这里,想必对spring的xml解析及BeanDefinition的生成有了一定的了解,多少知道了点spring的深浅,而不是只趋于表面,关于注解扫描处理类ComponetScanBeanDefinitionParser具体的解析我们下篇文章再揭晓,如果你看得还比较舒服的话,那么请不要吝啬你的双手点个关注吧。
spring源码之xml解析与BeanDefinition的封装-obtainFreshBeanFactory()
原文:https://www.cnblogs.com/tanyf/p/15059249.html