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

相关推荐
数据库小学妹1 分钟前
向量检索最小可运行实现:HNSW索引参数与召回率/延迟权衡
数据库·后端
姜鱼问生2 分钟前
Docker Volume 备份与恢复实战:不停机迁移数据
后端·算法·架构
suhan2 分钟前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
看浪的路人3 分钟前
第7讲:大模型后端服务化——Go 实现高并发 LLM Proxy / Router / Fallback
开发语言·后端·golang
suhan3 分钟前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
邱杰4703 分钟前
数智人事系统(十一):Spring Boot + MyBatis-Plus 的 CRUD 落地
后端·github
姜鱼问生4 分钟前
服务器磁盘满了?从告警到清理的完整排查
后端·算法·架构
邱杰4705 分钟前
数智人事系统(十三):考勤打卡与出勤日历
后端·github
suhan5 分钟前
【数据结构】三、栈和队列:4.栈的应用(括号匹配,四则运算表达式求值,进制转换,递归)
数据结构·后端·算法
用户072367066608 分钟前
用 MutatingWebhook 做一个通用 Agent 注入器:给任意业务 Pod 无侵入挂上探针/Agent(Java 实战)
后端