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成员内
接着回到
这个方法里面比较复杂以后再分析