Spring Boot整合Spring MVC与外部配置完整笔记

1. Spring MVC自动配置原理

核心机制

Spring Boot通过DispatcherServletAutoConfiguration自动配置DispatcherServlet,无需手动在web.xml中声明。默认拦截所有请求(/),但排除JSP请求。

关键组件自动配置

  • 视图解析器 :默认使用ContentNegotiatingViewResolver,支持多种视图解析策略(如JSP、Thymeleaf)。

  • 静态资源管理 :默认映射/webjars/**classpath:/static/等路径。

  • 消息转换器 :自动注册MappingJackson2HttpMessageConverter(JSON处理)等转换器。

  • 文件上传 :自动配置MultipartResolver,支持multipart/form-data表单提交。

示例配置application.properties):

复制代码
# 文件上传大小限制
spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB

2. Spring MVC扩展配置

通过实现WebMvcConfigurer接口扩展Spring MVC功能:

2.1 视图控制器(请求转发)
复制代码
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/tx").setViewName("success"); // /tx → success.html
    }
}
2.2 拦截器注册
复制代码
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("前置拦截");
        return true; // 继续流程
    }
}

// 配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor())
            .addPathPatterns("/**") // 拦截所有请求
            .excludePathPatterns("/hello2"); // 排除特定路径
}
2.3 消息转换器(Fastjson集成)
复制代码
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    FastJsonConfig config = new FastJsonConfig();
    config.setSerializerFeatures(SerializerFeature.PrettyFormat);
    converter.setFastJsonConfig(config);
    converters.add(converter);
}

实体类注解控制格式

复制代码
public class User {
    @JSONField(format = "yyyy-MM-dd")
    private Date createTime;
}
2.4 格式化器(日期处理)
复制代码
@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(new Formatter<Date>() {
        @Override
        public Date parse(String text, Locale locale) throws ParseException {
            return new SimpleDateFormat("yyyy-MM-dd").parse(text);
        }
    });
}

3. 静态资源管理

默认规则

  • 路径映射/webjars/**classpath:/META-INF/resources/webjars/

  • 静态资源路径classpath:/static/, classpath:/public/, classpath:/resources/

  • 欢迎页 :自动映射index.html到根路径(/)。

自定义配置application.properties):

复制代码
spring.resources.static-locations=classpath:/custom-static/
spring.mvc.static-path-pattern=/static/**

4. 文件上传配置

Controller示例

复制代码
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        try {
            String path = "D:/uploads/" + file.getOriginalFilename();
            file.transferTo(new File(path));
            return "上传成功";
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return "上传失败";
}

配置文件application.properties):

复制代码
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=/tmp

5. 外置Servlet容器配置

步骤

  1. 修改依赖pom.xml):

    复制代码
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <scope>provided</scope>
    </dependency>
  2. 打包为WAR

    • 修改pom.xml打包类型:

      复制代码
      <packaging>war</packaging>
    • 创建ServletInitializer类:

      复制代码
      public class ServletInitializer extends SpringBootServletInitializer {
          @Override
          protected SpringApplicationBuilder configure(SpringApplicationBuilder app) {
              return app.sources(YourApplication.class);
          }
      }
  3. 部署目录结构

    复制代码
    /WEB-INF
        web.xml (可选)
        classes/
            /static
            /templates

6. 高级配置
6.1 自定义Servlet/Filter/Listener
复制代码
@Bean
public ServletRegistrationBean<MyServlet> myServlet() {
    return new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
}

@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
    FilterRegistrationBean<Filter> filterRegBean = new FilterRegistrationBean<>();
    filterRegBean.setFilter(new MyFilter());
    filterRegBean.addUrlPatterns("/api/*");
    return filterRegBean;
}
6.2 跨域配置(CORS)
复制代码
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")
            .allowedOrigins("http://example.com")
            .allowedMethods("GET", "POST");
}

7. 总结
  • 自动配置 :Spring Boot通过条件化配置简化Spring MVC集成,默认覆盖核心组件(如DispatcherServlet、视图解析器)。

  • 扩展性 :通过WebMvcConfigurer接口灵活定制拦截器、消息转换器等。

  • 外置容器:支持WAR包部署到Tomcat等Servlet容器,适用于生产环境。

相关推荐
28岁青春痘老男孩4 小时前
JDK8+SpringBoot2.x 升级 JDK 17 + Spring Boot 3.x
java·spring boot
方璧4 小时前
限流的算法
java·开发语言
元Y亨H5 小时前
Nacos - 服务注册
java·微服务
曲莫终5 小时前
Java VarHandle全面详解:从入门到精通
java·开发语言
天若有情6735 小时前
校园二手交易系统实战开发全记录(vue+SpringBoot+MySQL)
vue.js·spring boot·mysql
一心赚狗粮的宇叔5 小时前
中级软件开发工程师2025年度总结
java·大数据·oracle·c#
while(1){yan}5 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
奋进的芋圆5 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
计算机程序设计小李同学5 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
小途软件6 小时前
用于机器人电池电量预测的Sarsa强化学习混合集成方法
java·人工智能·pytorch·python·深度学习·语言模型