2019独角兽企业重金招聘Python工程师标准>>>
##mvc.xml中可配置的元素##
既然是xml
,当然是要遵循schema
的规定. 那么schema文件在哪呢? 定位方法就是解开这个jar文件,找到META-INF/spring.schema
文件,这是个文本文件,里面包含了namespace
以及其对应的xsd
文件的位置. 由此得出:mvc的schema
是spring-mvc-{version}.xsd
,位于spring-webmvc-{version}.jar
文件的org.springframework.web.servlet.config
包中. 该schema的一级标签有5个(annotation-driven
,resources
,default-servlet-handler
,interceptors
,view-controller
).至于每个element的含义及下属标签的配置,后面有时间在讲,此处跳过.
##解析配置##
前面的文章讲到过spring是如何解析不同namespace的xml文件的.这里我们就以mvc为例再过一遍.
依然是解压jar文件,这次去找META-INF/spring.handlers
,这也是个文本文件.里面告诉我们xml中mvc专属标签的处理是org.springframework.web.servlet.config.MvcNamespaceHandler
干的. 我们看一下这个类:此类中就一个init方法,里面指出了上一章中提到的5个一级标签分别对应的处理器类.
public void init() {registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
}
这几个类中就涉及了我们比较熟悉的.HandlerMapping
,HandlerAdapter
,HandlerInterceptor
,HandlerMethodArgumentResolver
等. 处理器中新建了这些类的BeanDefinition
.BeanDefinition
也就包含了默认的properties的设置.比如说默认的拦截器,默认的参数解析器,默认的类型转换器等. 然后把这些BeanDefinition
注册到Bean容器中.
##君在何处##
spring mvc的执行过程是从DispatcherServlet
开始的.这个类在初始化的时候会从bean容器中把上面注册的BeanDefinition
实例化出来,放到类变量里面备用.
protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context);
}