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容器,适用于生产环境。

相关推荐
devlei4 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
pshdhx_albert5 小时前
AI agent实现打字机效果
java·http·ai编程
沉鱼.445 小时前
第十二届题目
java·前端·算法
努力的小郑6 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
赫瑞6 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
Victor3566 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3567 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁7 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp7 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
周末也要写八哥7 小时前
多进程和多线程的特点和区别
java·开发语言·jvm