我们已经知道,DispatcherServlet 最重要的工作是接收请求并转发给特定的 Controller,因此首先需要配置的是 url 映射
DispatcherServlet 启动时,会创建 Spring 应用上下文,并加载配置文件或配置类中所声明的 bean,因此我们需要在 DispatcherServlet 的配置中指定 bean 所在的配置文件或 java Configuration 类,这些 bean 包含 web 组件的 bean,如 Controller、视图解析器及处理器映射
在 Spring Web 应用中,还会有另一个应用上下文,用来加载驱动应用后端的中间层和数据层组件的其他 bean,这些 bean 由 ContextLoaderListener 创建的应用上下文来加载
XML 配置
上述配置在上一篇日志中有相应的介绍(web.xml):
contextConfigLocation
classpath*:ApplicationContext.xml
org.springframework.web.context.ContextLoaderListener
appServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/ServletContext.xml
1
appServlet
/
如上所述,我们在 DispatcherServlet 配置中加载了两个应用上下文配置,分别是 Spring 应用上下文 ApplicationContext.xml 以及 Spring Web 项目中需要使用的另一个上下文配置:ServletContext.xml
当我们需要启动 spring mvc 的供能时,只需要在 ServletContext.xml 中写入:
Java 代码配置
Spring3.1 提供了使用 java 代码来进行上述配置,这可能是更加易于理解的方式
DispatcherServlet 初始化配置
Spring 会扫描整个工程,并将所有扩展了 AbstractAnnotationConfigDispatcherServletInitializer 的类都自动配置为 DispatcherServlet 和 Spring 应用上下文配置,因此,我们首先需要做的就是创建配置类并继承 AbstractAnnotationConfigDispatcherServletInitializer,当然, 类名我们可以任意取
package com.techlog.test.configuration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* DispatcherServlet 初始化配置
* Created by techlog on 2016/11/17.
*/
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* @return Spring 应用上下文配置类
*/
@Override
protected Class>[] getRootConfigClasses() {
return new Class>[] { RootConfig.class };
}
/**
* @return Servlet Web 上下文配置类
*/
@Override
protected Class>[] getServletConfigClasses() {
return new Class>[] { WebConfig.class };
}
/**
* @return 匹配的 URL 模式
*/
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
Servlet Web 上下文配置
接下来,我们来创建上面用到的 WebConfig.class
package com.techlog.test.configuration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* Web 组件 Bean 配置
* Created by techlog on 2016/11/17.
*/
@Configuration
@EnableWebMvc
@ComponentScan("com.techlog.test")
public class WebConfig extends WebMvcConfigurationSupport {
@Override
protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
@EnableWebMvc 注解与上文提到的 功能是一样的
@ComponentScan 注解则与 的功能是一样的
接下来我们只要在 WebConfig 中加入我们需要的 Bean 声明即可,可以参考:
我们重写了 configureDefaultServletHandling 方法,这个方法是用来指定处理静态资源请求的 Servlet 的,我们调用 configurer.enable() 方法将对静态资源的请求转发到 Servlet 容器中默认的 Servlet 处理而不是使用 DispatcherServlet 本身来处理这些请求
Spring 应用上下文配置
接下来,我们需要创建 Spring 应用上下文配置类 RootConfig.class
package com.techlog.test.configuration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
/**
* Spring 应用上下文配置
* Created by techlog on 2016/11/17.
*/
@Configuration
@ComponentScan(basePackages = "com.techlog.test",
excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) })
public class RootConfig {
}
RootConfig 中我们就可以创建和定义 Spring 应用所需要的 Bean 了,同时,我们在 @ComponentScan 注解的属性中配置排除了对所有 WebMVC 配置的扫描