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

进入configureAndRefreshWebApplicationContext

refresh()

进入

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

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

进入 XmlBeanDefinitionReader对象内部

解析成doc对象

新建一个BeanDefinitionDocumentReader documentReader

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

解析出来根对象

解析bean定义

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

接着resolve

接着

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

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

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

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

下一层是AppClassLoader

再下一层是URLclassloader

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

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

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

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

接着回到

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

posted @ 2021-07-21 18:40  张艳涛&java  阅读(215)  评论(0编辑  收藏  举报