tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

时间:2023-03-08 23:31:24
tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

writedby 张艳涛,看springmvc 的源码太难了,怎么办,

这篇文章主要分析了看透springmvc的第9章结尾的 如何解析xml 命名空间标签

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd ">
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- 处理器 -->
<bean id="NoannaContoller" name="/go2.action" class="com.zyt.NoannaContoller"></bean>
<!-- 处理器映射器 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
<mvc:annotation-driven/>
</beans>

之前真没注意过,说的命名空间配置的标签是就是xmlns, 标签就是mvc,如上图的整个红色空间,

现在的想法还比较初步,现在理解的主要想法是在dispatcherservlet 一定会配置的就是

        <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>

那么一定会解析这个springmvc.xml

这个流程是createWebApplicationContext

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

进入configureAndRefreshWebApplicationContext

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

refresh()

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

进入

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

主要下面的 新建了一个XmlBeanDefinitionReader 对象

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

获取configLocations 本例中只有classpath:springmvc.xml

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

进入 XmlBeanDefinitionReader对象内部

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

解析成doc对象

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

新建一个BeanDefinitionDocumentReader documentReader

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

这里注意创建createReaderContext过程之中创建了他的成员

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

解析出来根对象

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

解析bean定义

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

找到了 名字为mvc:annotation-driven 的标签

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

接着resolve

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

接着

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

读取所有的META-INF/spring.handlers的值,在所有的spring包内都有一个这个文件,这个参数 有一个classloader 就带有他读取jar包路径

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

这里使用类加载器的parent加载器urlloader

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

上边的方法是在ClassLoader.getResource()方法,平时所说的加载模式能在这里看到

其中最上层Launcher$ExtClassLoader,他的parent是null;

下一层是AppClassLoader

再下一层是URLclassloader

磨磨唧唧的读取了如下属性

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

接着resolve函数中按照读取的配置文件 新建对象,反射创建

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

之后进入namespaceHandler.init();  创建的org.springframework.web.servlet.config.MvcNamespaceHandler对象的initial()方法

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

进入父类的方法,将parse方法父类的parsers成员内

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

接着回到

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

这个方法里面比较复杂以后再分析