目录
文章源码仓库:Spring Learn Repo
配置SpringMVC的初始化信息
- 之前说过,SpringMVC中使用两个WebApplicationContext:ServletWebApplicationContext和RootWebApplicationContext对Web上下文环境进行分层管理。
- ServletWebApplicationContext:用于管理Servlet相关的Bean,如控制器,视图解析器等,每个Servlet(通常是DispatcherServlet)都有自己的ServletWebApplicationContext;并且Scope与Servlet相对应
- RootWebApplicationContext:是整个Web应用的上下文,用于管理应用程序级别的Bean,如Service,Repositories等,RootWebApplicationContext可以被多个Servlet共享,且Scope与整个Web应用相同。
配置ServletWebApplicationContext
- 上文提到过每个DispatcherServlet都有一个ServletWebApplicationContext用于存储Servlet的相关Bean,因此我们需要扫描Controller注解标记的Bean
- @EnableWebMvc:值得注意的是,这里还需要Spring MVC开启基于注解的基础功能以及一些默认配置。
- 通过此注解SpringMVC会自动注册包括DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter等用于处理注解映射和处理方法的适配器。
- 并且允许在Controller标记类的类和方法上使用@RequestMapping,@RequestParam等HTTP请求与响应方面的注解驱动
如果你发现RequestParam没法使用的话可以查看是否开启了此注解
- 而且此注解还提供了一些常见的用于处理请求参数的类型转换,如字符串转数字,json格式之间的转换等
@Configuration
@ComponentScan({
"com.nobugnolife.controller"})
@EnableWebMvc
public class SpringMvcConfig {
}
配置RootWebApplicationContext
- 上文说过RootWebApplicationContext里面是Web用于管理应用程序级别的Bean,如Service,Repositories等,而我们这里只是演示SpringMVC的功能,所以就不配置持久层了
@Configuration
@ComponentScan({
"com.nobugnolife.service"})
public class SpringConfig {
}
配置ServletContext
- Spring提供了WebApplicationInitializer接口可以让我们注册并初始化DispatcherServlet
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
// 加载ServletWebApplicationContext配置信息
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
// 注册SpringMVC的配置类
context.register(SpringMvcConfig.class);
// 创建并注册DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
- 官方文档里提供了一个简化的创建方案通过继承 AbstractAnnotationConfigDispatcherServletInitializer 并覆写特定的方法,用以简化配置开发
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{
SpringConfig.class};
}
@Override
protected Class<<