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 小时前
急招!前端|测试|后端|产品(名额多,速来)
前端·后端·架构
喵个咪2 小时前
Go-Wind HTTP 服务器从入门到精通
后端·http·go
hunterandroid2 小时前
Hilt 依赖注入:从手动 new 到自动装配
后端
喵个咪2 小时前
Go-Wind gRPC 服务器从入门到精通
后端·go·grpc
喵个咪2 小时前
Go-Wind GraphQL 服务器从入门到精通
后端·graphql
青青子衿悠悠我心2 小时前
Docker与Kubernetes的十年战争与融合
后端
AI小老六2 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
云技纵横3 小时前
@Transactional 到底要不要加 rollbackFor?一次数据不一致事故讲清楚
后端·面试
Csvn3 小时前
日志分析进阶 — Logwatch 与 GoAccess 实战
后端