Spring MVC初始化

   整个Spring MVC的初始化,配置了DispatcherServlet和ContextLoaderListener,那么它们是如何初始化Spring IoC容器上下文和映射请求上下文的呢?所以这里的初始化会涉及两个上下文的初始化,只是映射请求上下文是基于Spring IoC上下文扩展出来,以适应JavaWeb工程的需要。

初始化Spring IoC上下文

  Java Web容器为其生命周期中提供ServletContextListener接口,这个接口可以在Web容器初始化和结束期中执行一定的逻辑,换句话说,通过实现它可以使得在DispatcherServlet初始化前就可以完成Spring IoC容器的初始化,也可以在结束期完成对Spring IoC容器的销毁,只要实现ServletContextListener接口的方法就可以了。

初始化映射请求上下文

  映射请求上下文是通过DispatcherServlet初始化的,它和普通的Servlet也是一样的,可以根据自己的需要配置它在启动时初始化,或者等待用户第一次请求的时候进行初始化。注意,也许你在Web工程中并没有注册ContextLoaderListener,这个时候DispatcherServlet就会在其初始化的时候进行对Spring IoC容器的初始化。这样你也许会有一个疑问:选择在什么时候初始化DispatcherServle?首先,初始化一个Spring IoC容器是一个耗时的操作,所以这个工作不应该放到用户请求上,没有必要让一个用户陷入长期等待中,因此大部分场景下,都应该让DispatcherServle在服务器启动期间就完成Spring IoC容器的初始化,我们可以在Web容器刚启动的时候,也可以在Web容器载入DispatcherServle的时候进行初始化。笔者的建议是在Web容器刚开始的时候对其初始化,因为在整个Web的初始化中,不只是DispatcherServle需要使用到Spring IoC的资源,其他的组件可能也需要。在最开始就初始化可以让Web中的各个组件共享资源。当然你可以指定Web容器中组件初始化的顺序,让DispatcherServle第一个初始化,来解决这个问题,但是这就加大了配置的复杂度,因此大部分的情况下都建议使用ContextLoaderListener进行初始化。


  从图中可以看出,DispactherServlet的父类是FrameworkServlet,而FrameworkServlet的父类则是HttpServletBean。HttpServletBean继承了Web容器所提供的HttpServlet,所以它是一个可以载入Web容器中的Servlet。

Spring MVC的核心组件
  •MultipartResolver:文件解析器,用于支持服务器的文件上传。
  •LocaleResolver:国际化解析器,可以提供国际化的功能。
  •ThemeResolver:主题解析器,类似于软件皮肤的转换功能。
  •HandlerMapping:Spring MVC中十分重要的内容,它会包装用户提供一个控制器的方法和对它的一些拦截器,后面会着重谈它,通过调用它就能够运行控制器。
  •handlerAdapter:处理器适配器,因为处理器会在不同的上下文中运行,所以Spring MVC会先找到合适的适配器,然后运行处理器服务方法,比如对于控制器的SimpleControllerHandlerAdapter、对于普通请求的HttpRequestHandlerAdapter等。
  •HandlerExceptionResolver:处理器异常解析器,处理器有可能产生异常,如果产生异常,则可以通过异常解析器来处理它。比如出现异常后,可以转到指定的异常页面,这样使得用户的UI体验得到了改善。
  •RequestToViewNameTranslator:视图逻辑名称转换器,有时候在控制器中返回一个视图的名称,通过它可以找到实际的视图。当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名。
  •ViewResolver:视图解析器,当控制器返回后,通过视图解析器会把逻辑视图名称进行解析,然后定位实际视图。

使用注解配置方式初始化

  由于在Servlet3.0之后的规范允许取消web.xml配置,只使用注解方式便可以了,所以在Spring3.1之后的版本也提供了注解方式的配置。使用注解方式很简单,首先继承一个名字比较长的类AbstractAnnotationConfigDispatcherServletInitializer,然后实现它所定义的方法。它所定义的内容就不是太复杂,甚至是比较简单的,让我们通过一个类去继承它,如代码清单14-10所示,它实现的是入门实例的功能。
  代码清单14-10:通过注解方式初始化Spring MVC
package com.ssm.chapter14.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    //Spring IoC容器配置
    //getRootConfigClasses获取Spring IoC容器的Java配置类,用以装载各类Spring Bean。
    @Override
    protected Class<?>[] getRootConfigClasses() {
        //可以返回Spring的Java配置文件数组
        return new Class<?>[]{};
    }

    //DispatcherServlet的URI映射关系配置
    //getServletConfigClasses获取各类Spring MVC的URI和控制器的配置关系类,用以生成Web请求的上下文。
    @Override
    protected Class<?>[] getServletConfigClasses() {
        //可以返回Spring的Java配置文件数组
        return new Class<?>[]{WebConfig.class};
    }

    //DispatcherServlet拦截内容
    // getServletMappings定义DispatcherServlet拦截的请求。
    @Override
    protected String[] getServletMappings() {
        return new String[]{"*.do"};
    }

}
  MyWebAppInitializer也实现了WebApplicationInitializer接口。ContextLoader和DispatcherServlet的初始化器都是抽象类,通过它们就能初始化Spring IoC上下文和映射关系上下文,这就是只要继承AbstractAnnotationConfigDispatcherServle-tInitializer类就完成了DispatcherServlet映射关系和SpringIoC容器的初始化工作的原因。

  代码清单14-12:WebConfig.java
package com.ssm.chapter14.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
//定义扫描的包,加载控制器
@ComponentScan("com.ssm.chapter14.*")
//启用Spring Web MVC
@EnableWebMvc
public class WebConfig {

    /***
     * 创建视图解析器
     *  @return 视图解析器
     */
    @Bean(name = "viewResolver")
    public ViewResolver initViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

}
  这段代码和Spring IoC使用Java的配置也是一样的,只是多了一个注解@EnableWebMvc,它代表启动Spring MVC框架的配置。和入门实例同样也定义了视图解析器,并且设置了它的前缀和后缀,这样就能获取由控制器返回的视图逻辑名,进而找到对应的JSP文件。
  如果还是使用入门实例进行测试,此时可以把web.xml和所有关于Spring IoC容器所需的XML文件都删掉,只使用上面两个Java文件作为配置便可以了,然后重启服务器 
原文地址:https://www.cnblogs.com/ooo0/p/11103548.html