学习笔记:springmvc4.3源码学习:spring解析配置文件过程
2017-11-13 19:47
951 查看
本章节主要学习spring中xml的解析过程。
一、入口
在web.xml配置文件中可以看到springmvc配置了DispatcherServlet,说明入口是该类。一般我们知道初始化方法大概是init()之类的,但是在DispatcherServlet中并没有找到该方法,我们可以查找他的父类,最终在HttpServletBean中找到初始化方法init()。从这里也可以看出DispatcherServlet也是一个servlet。
DispatcherServlet类-->FrameworkServlet类-->HttpServletBean类-->init()方法。
init() ->initWebApplicationContext() ->configureAndRefreshWebApplicationContext(cwac);
跟着截图标记,一步步往下走。
进入configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac)方法中,可以看到最后一行wac.refresh()。点进去
在子类AbstractApplicationContext中实现了refresh()方法。这里类与接口等之间的关系比较复杂,在这里就不一一列举出来。(列出来感觉也没什么用。。)
这里就不截图了。。直接列出跟踪路径。 进入上面截图中的(ConfigurableListableBeanFactory类)obtainFreshBeanFactory() ----》 (AbstractRefreshableApplicationContext类)refreshBeanFactory() 方法中的 loadBeanDefinitions(beanFactory); 通过该方法加载xml配置文件。
继续跟踪代码,loadBeanDefinitions(XmlBeanDefinitionReader reader) ---》reader.loadBeanDefinitions(configResources)
---》loadBeanDefinitions(resource); 进入该方法的子类 XmlBeanDefinitionReader的实现。这里会将一个 new EncodedResource(resource) 传入
encodedResource是将Resource进行封装(封装编码等信息)。每一个xml文件对应一个Resource。
继续跟踪代码
这里通过doLoadDocument(inputSource, resource),得到document。到这里大家是不是有点熟悉了,拿到了每个xml的上下文对象。
得到Document之后将它注册到beandefinitions中。
registerBeanDefinitions(Document doc, XmlReaderContext readerContext) --》doRegisterBeanDefinitions(root); doRegisterBeanDefinitions(Element root) --》parseBeanDefinitions(root, this.delegate);
如上截图,在这里开始解析xml文件中的元素。parseDefaultElement(ele, delegate) 解析默认元素(import、alias、bean、beans),delegate.parseCustomElement(ele)解析自定义元素。这里可以先重点看解析默认元素方法中解析bean元素的代码。
processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) --》delegate.parseBeanDefinitionElement(ele) --》parseBeanDefinitionElement(ele, null) --》parseBeanDefinitionElement(ele, beanName, containingBean);
这里主要看下parseBeanDefinitionElement(
Element ele, String beanName, BeanDefinition containingBean) 这个方法
截图的代码大家可以点进去看下,这里创建beandefinition后,再将标签bean的一些信息(属性等)保存到beandefinition中。
跟踪代码可以看到spring 将解析的元素封装到BeanDefinition 对象中(spring中的注解也会封装成BeanDefinition )
BeanDefinition会把xml里面的标签封装成BeanDefinition对象,以及annotation注解(@Service、@Controller等)封装成BeanDefinition(面后会讲到)
大致流程: xml -> ResourceLoader ->Resoucre ->xxxReader ->BeanDefinition -> 注册
以上就是spring对默认元素的解析,现在我们看下对自定义元素的解析:
上面截图中的 delegate.parseCustomElement(ele); 就是对自定义元素的解析。我们点进去查看具体的解析过程。
getNamespaceHandlerResolver().resolve(namespaceUri);
上面截图中,getHandlerMappings()方法 ,将所有配置文件(各组件下META-INF下的文件)中的 命名空间以及对应的uri (xmlns:context="http://www.springframework.org/schema/context")存入map中。每个uri对应了一个类(namespace),通过handlerMappings.get(namespaceUri); 得到对应的namespace(类名,
4000
后面通过反射得到对应的实例).
调用对应namespace的init()方法(这里举例context),可以看到spring会将对应命名空间的解析器进行注册,这样后面就可以解析对应的标签了,用解析器解析对应的标签这里就不给列出来了。
spring解析对应的xml文件一个大致的流程就是这样。
一、入口
在web.xml配置文件中可以看到springmvc配置了DispatcherServlet,说明入口是该类。一般我们知道初始化方法大概是init()之类的,但是在DispatcherServlet中并没有找到该方法,我们可以查找他的父类,最终在HttpServletBean中找到初始化方法init()。从这里也可以看出DispatcherServlet也是一个servlet。
DispatcherServlet类-->FrameworkServlet类-->HttpServletBean类-->init()方法。
init() ->initWebApplicationContext() ->configureAndRefreshWebApplicationContext(cwac);
跟着截图标记,一步步往下走。
进入configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac)方法中,可以看到最后一行wac.refresh()。点进去
在子类AbstractApplicationContext中实现了refresh()方法。这里类与接口等之间的关系比较复杂,在这里就不一一列举出来。(列出来感觉也没什么用。。)
这里就不截图了。。直接列出跟踪路径。 进入上面截图中的(ConfigurableListableBeanFactory类)obtainFreshBeanFactory() ----》 (AbstractRefreshableApplicationContext类)refreshBeanFactory() 方法中的 loadBeanDefinitions(beanFactory); 通过该方法加载xml配置文件。
继续跟踪代码,loadBeanDefinitions(XmlBeanDefinitionReader reader) ---》reader.loadBeanDefinitions(configResources)
---》loadBeanDefinitions(resource); 进入该方法的子类 XmlBeanDefinitionReader的实现。这里会将一个 new EncodedResource(resource) 传入
encodedResource是将Resource进行封装(封装编码等信息)。每一个xml文件对应一个Resource。
继续跟踪代码
这里通过doLoadDocument(inputSource, resource),得到document。到这里大家是不是有点熟悉了,拿到了每个xml的上下文对象。
得到Document之后将它注册到beandefinitions中。
registerBeanDefinitions(Document doc, XmlReaderContext readerContext) --》doRegisterBeanDefinitions(root); doRegisterBeanDefinitions(Element root) --》parseBeanDefinitions(root, this.delegate);
如上截图,在这里开始解析xml文件中的元素。parseDefaultElement(ele, delegate) 解析默认元素(import、alias、bean、beans),delegate.parseCustomElement(ele)解析自定义元素。这里可以先重点看解析默认元素方法中解析bean元素的代码。
processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) --》delegate.parseBeanDefinitionElement(ele) --》parseBeanDefinitionElement(ele, null) --》parseBeanDefinitionElement(ele, beanName, containingBean);
这里主要看下parseBeanDefinitionElement(
Element ele, String beanName, BeanDefinition containingBean) 这个方法
截图的代码大家可以点进去看下,这里创建beandefinition后,再将标签bean的一些信息(属性等)保存到beandefinition中。
跟踪代码可以看到spring 将解析的元素封装到BeanDefinition 对象中(spring中的注解也会封装成BeanDefinition )
BeanDefinition会把xml里面的标签封装成BeanDefinition对象,以及annotation注解(@Service、@Controller等)封装成BeanDefinition(面后会讲到)
大致流程: xml -> ResourceLoader ->Resoucre ->xxxReader ->BeanDefinition -> 注册
以上就是spring对默认元素的解析,现在我们看下对自定义元素的解析:
上面截图中的 delegate.parseCustomElement(ele); 就是对自定义元素的解析。我们点进去查看具体的解析过程。
getNamespaceHandlerResolver().resolve(namespaceUri);
上面截图中,getHandlerMappings()方法 ,将所有配置文件(各组件下META-INF下的文件)中的 命名空间以及对应的uri (xmlns:context="http://www.springframework.org/schema/context")存入map中。每个uri对应了一个类(namespace),通过handlerMappings.get(namespaceUri); 得到对应的namespace(类名,
4000
后面通过反射得到对应的实例).
调用对应namespace的init()方法(这里举例context),可以看到spring会将对应命名空间的解析器进行注册,这样后面就可以解析对应的标签了,用解析器解析对应的标签这里就不给列出来了。
spring解析对应的xml文件一个大致的流程就是这样。
相关文章推荐
- mybatis源码学习之执行过程分析(2)——config.xml配置文件和mapper.xml映射文件解析过程
- spring源码(3)之解析配置文件的过程
- spring MVC学习笔记(二) springMVC.xml配置文件解析
- Spring源码学习--Spring配置文件解析BeanDefinitionDocumentReader(三)
- Spring源码学习--Spring配置解析文件ApplicationContext.xml(一)
- 【spring源码学习】springMVC之映射,拦截器解析,请求数据注入解析,DispatcherServlet执行过程
- Spring源码学习--Spring配置文件解析BeanDefinitionReader(二)
- spring-security学习笔记--配置文件
- HaProxy学习笔记3: 1.4.23的配置文件解析-examples.cfg
- 学习Hibernate源码——配置文件解析,SessionFactory创建
- spring-security学习笔记--配置文件
- spring学习笔记(4)——配置文件配置bean自动装配
- Spring学习笔记(18)----使用Spring配置文件实现事务管理
- Spring源码解析配置文件装载与解析
- spring-security学习笔记--配置文件
- Spring4学习笔记-Spring4整合Struts2(基于配置文件的方式)
- spring源码解读-加载解析配置文件
- Spring4学习笔记-声明式事务(基于配置文件的方式)
- ibatis源码学习2_初始化和配置文件解析
- ITCAST视频-Spring学习笔记(使用Spring配置文件实现AOP)