spring mvc 配置解析之xml

mvc.xml中可配置的元素

既然是xml,当然是要遵循schema的规定.
那么schema文件在哪呢?
定位方法就是解开这个jar文件,找到META-INF/spring.schema文件,这是个文本文件,里面包含了namespace以及其对应的xsd文件的位置.
由此得出:mvc的schemaspring-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);
}

你可能感兴趣的:(spring,mvc)