SpringBoot为什么要扩展SpringMVC?
SpringBoot虽然通过自动配置简化了SpringMVC的配置,但在实际开发中经常需要自定义SpringMVC的行为。
SpringBoot的默认配置可能不满足一下需求:
- 自定义拦截器(登录验证、权限检查)
- 跨域配置(CORS)
- 格式化器(日期、数据格式化)
- 视图控制器(直接映射URL到视图)
- 静态资源处理
- 消息转换器(JSON、XML处理)
- 参数解析器(自定义请求参数解析)
WebMvcConfigurer接口的作用
WebMvcConfigurer是一个回调接口 ,允许开发者在不使用@EnableWebMvc的情况下定制SpringMVC的配置:
java
public interface WebMvcConfigurer {
// 配置路径匹配
default void configurePathMatch(PathMatchConfigurer configurer) {}
// 配置内容协商
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}
// 配置异步支持
default void configureAsyncSupport(AsyncSupportConfigurer configurer) {}
// 配置默认Servlet处理
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}
// 添加格式化器
default void addFormatters(FormatterRegistry registry) {}
// 添加拦截器
default void addInterceptors(InterceptorRegistry registry) {}
// 添加静态资源处理器
default void addResourceHandlers(ResourceHandlerRegistry registry) {}
// 添加CORS映射
default void addCorsMappings(CorsRegistry registry) {}
// 添加视图控制器
default void addViewControllers(ViewControllerRegistry registry) {}
// 配置视图解析器
default void configureViewResolvers(ViewResolverRegistry registry) {}
// 添加参数解析器
default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {}
// 添加返回值处理器
default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {}
// 配置消息转换器
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
// 扩展消息转换器
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}
// 配置处理器异常解析器
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
// 扩展处理器异常解析器
default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
}
如何使用WebMvcConfigurer接口?
WebMvcConfigurer是SpringBoot给的MVC扩展入口,通过实现该接口并重写对应方法,可定制MVC行为,无需修改框架源码。
【一】注册视图控制器(请求转发)
视图控制器主要用于简化无业务逻辑的页面跳转,避免为简单的页面跳转创建空Controller。
**【问题】**为了一个简单的页面跳转,需要创建完整的Controller,这种Controller很冗余,只做转发工作。例如:
java
@Controller
public class SimpleController {
@GetMapping("/home")
public String home() {
return "home"; // 只是返回视图名,没有业务逻辑
}
}
【解决】 可通过注册视图解析器进行简单页面直接跳转,不需要创建Controller。
【操作】 通过 @Configuration 注解创建配置类,在配置类中重写 WebMvcConfigurer接口中的 addViewControllers 方法。
java
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
// 注册视图控制器(请求转发/tx → success.html)
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/tx").setViewName("success");
}
}
【效果】 访问 http:///localhost:8080/tx,直接跳转到success.html,不用写@GetMapping("/tx")的Controller方法。
【实际应用场景】
- 登录/注册页面
- 主页和引导页
- 错误页面
- 静态内页面
- 管理界面入口
- 重定向功能
- 状态码页面
【视图控制器的优势对比】
- 传统方式:每个方法都很简单,只是返回视图名,方法体几乎为空
- 产生大量样板代码
- Controller类变得臃肿
- 不易维护
- 视图控制器方式:
- 一行代码解决一个页面跳转
- 清晰、简洁、易于管理
【使用建议】
- 对于纯页面跳转(无业务逻辑)使用视图控制器
- 将视图控制器按功能模块分类配置
- 结合拦截器实现权限控制
【二】注册格式化器(Formatter)
【核心作用】
- **parse():**字符串 → Date(接收数据)
- **print():**Date → 字符串(显示数据)
**【问题】**没有格式化器时,每个方法都需要手动转换日期为字符串。代码重复、格式不统一、容易出错。
【解决】 可通过注册格式化器转换日期为字符串,且支持多种日期格式。
【操作】 通过 @Configuration 注解创建配置类,在配置类中重写 WebMvcConfigurer接口中的 addFormatters 方法。
java
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
// 注册注册格式化器(日期格式化)
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new Formatter<Date>() {
// ============ 1. 多种日期格式支持 ============
private final SimpleDateFormat[] formats = {
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyy年MM月dd日"),
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") // ISO格式
};
@Override
public Date parse(String text, Locale locale) throws ParseException {
return new SimpleDateFormat("yyyy-MM-dd").parse(text);
// parse(): 字符串 → Date(接收数据)
}
@Override
public String print(Date date, Locale locale) {
return new SimpleDateFormat("yyyy-MM-dd").format(date);
// print(): Date → 字符串(显示数据)
}
});
}
}
当然通过 application.yml配置也是可以办到的。
但用Formatter更灵活,能加自定义逻辑(比如校验日期合法性)。
**【效果】**将后端传递的 2005/2/2 格式转换为 2005-02-02
【格式化优势】
- 全局同一转换,减少代码重复
- 格式化同一
- 集中错误处理,提高健壮性
- 前后端协作,自动格式匹配,减少沟通成本
- 安全可控
【使用建议】
- 优先使用Spring内置的**
@DateTimeFormat、@NumberFormat** - 复杂场景使用自定义Formatter
- 为常用业务对象(金额、日期、枚举)注册格式化器
- 结合Converter使用更灵活
【三】注册消息转换器(FastJSON)
消息转换器是Spring MVC中负责HTTP请求/响应数据格式转换的核心组件。
【作用】将 Java 对象与 JSON 数据相互转换
- 输入:HTTP 请求中的 JSON 数据 → Java 对象
- 输出:Java 对象 → HTTP 响应中的 JSON 数据
**【解决】**使用消息转换器后代码更简洁,且自动转换。
【操作】
-
先在pom.xml文件中引入fastjson依赖
XML<!--引入fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> -
通过 @Configuration 注解创建配置类,在配置类中重写 WebMvcConfigurer接口中的 configureMessageConverters方法。
java@Configuration public class MyMvcConfig implements WebMvcConfigurer { // 注册FastJSON HTTP 消息转换器 @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 1. 创建 FastJSON 消息转换器实例 FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); // 2. 创建 FastJSON 配置对象 FastJsonConfig config = new FastJsonConfig(); // 3. 设置序列化特性 config.setSerializerFeatures( SerializerFeature.PrettyFormat, // 美化输出 SerializerFeature.WriteMapNullValue, // 输出空值字段 SerializerFeature.WriteNullListAsEmpty, // 空列表输出为 [] SerializerFeature.WriteNullStringAsEmpty, // 空字符串输出为 "" SerializerFeature.WriteDateUseDateFormat // 日期格式化 ); // 4. 设置支持的媒体类型和字符编码 List<MediaType> supportedMediaTypes = new ArrayList<>(); supportedMediaTypes.add(MediaType.APPLICATION_JSON); supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); converter.setSupportedMediaTypes(supportedMediaTypes); // 5. 将配置应用到转换器 converter.setFastJsonConfig(config); // 6. 将转换器添加到转换器列表 converters.add(converter); } }
【效果】

【进阶】 实体类中可以用**@JSONField**注解定制字段,比如指定日期字段的输出格式:
java
@JSONField(format = "yyyy-MM-dd")
private Date birth;
【自定义转换器】
- 字符串转换:createStringConverter()
- FastJson:createFastJsonConverter()
- Jackson备用:createJacksonConverter()
- 字节数组:createByteArrayConverter()
- 资源文件:createResourceConverter()
【四】注册拦截器
【核心作用 】拦截器是Spring MVC中AOP思想的具体实现 ,允许在请求处理的不同阶段插入自定义逻辑。
**【解决】**想在接口调用的不同阶段做统一处理,比如:
- 请求处理前:校验用户是否登录;
- 请求处理后:记录接口耗时;
- 请求完成后:清理资源;
【操作】
-
创建拦截器类,实现
HandlerInterceptor接口,重写3个核心方法:java// 创建拦截器 public class MyInterceptor implements HandlerInterceptor { // 前置拦截(核心:返回true放行,false拦截) @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); System.out.println("【前置拦截】请求路径" + requestURI + ",准备执行控制器方法"); return true;// 放行 } // 后置拦截:控制器方法执行后、视图渲染前调用(若控制器抛异常,此方法不执行) @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("【后置拦截】控制器方法执行完成,尚未渲染视图"); } // 最终拦截:视图渲染完成后调用 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("【最终拦截】请求处理完成,视图已渲染,释放资源"); } } -
通过 @Configuration 注解创建配置类,在配置类中重写 WebMvcConfigurer接口中的 addInterceptors方法。
java@Configuration public class MyMvcConfig implements WebMvcConfigurer { // 注册拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) // 1. 创建拦截器实例 .addPathPatterns("/**") // 2. 设置拦截路径(所有路径) .excludePathPatterns("/hello"); // 3. 设置排除路径(/hello 路径不拦截) } }
【**关键】**拦截器的路径配置很灵活,能精准控制哪些接口需要拦截、哪些跳过。
【实际应用场景】
- 权限认证和授权
- 接口限流和防刷
- 日志记录和性能监控
- 数据预处理和后处理
- 多拦截器链的实际应用
SpringBoot注册Servlet三大组件:Servlet、Filter、Listener
在传统的SSM项目中的web.xml中配置:
- Servlet主要用于拦截和处理请求,以及调用Controller层
- Filter主要用于配置字符编码格式,解决中文乱码的问题
- Listener主要用于监听spring的配置文件有没有被加载
由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
【一】注册Servlet
1. Servlet的核心作用
Servlet是Java EE规范中用于处理Web请求和响应的核心组件。它运行在Servlet容器(如Tomcat、Jetty)中,用于扩展服务器的功能,动态生成Web内容。
主要作用:
- **接收HTTP请求:**Servlet可以处理GET、POST等HTTP方法。
- **生成动态响应:**根据请求参数、会话状态等生成HTML、JSON、XML等动态内容。
- **会话管理:**通过HttpSession管理用户会话状态。
- **过滤器和监听器:**可以与过滤器(Filter)和监听器(Listener)结合,实现请求的预处理和后处理,以及监听上下文、会话等事件。
在Spring MVC中,DispatcherServlet是前端控制器,负责将请求分发给不同的处理器(Controller)。但是,我们仍然可以注册自定义的Servlet来处理特定的请求。
2. SpringBoot注册Servlet的方式
【方式一 】使用配置类: 使用**@Bean** 注解注册 ServletRegistrationBean (推荐)
**第一步:**自定义Servlet,并继承 HttpServlet
java
/**
* 自定义Servlet
*/
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// super.doGet(req, resp);
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("<h1>Hello from MyServlet</h1>");
out.println("<p>当前时间: " + new Date() + "</p>");
out.flush();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// super.doPost(req, resp);
// 设置响应编码,避免中文乱码
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
// 向客户端输出响应内容
writer.write("【自定义MyServlet】请求成功!");
writer.write("<br/>请求路径:" + req.getRequestURI());
writer.flush();
writer.close();
}
}
第二步:编写配置类
java
@Configuration
public class WebServerConfig {
@Bean
public ServletRegistrationBean<MyServlet> myServlet(){
System.out.println("=========Servlet开始=========");
// 构造参数:1.自定义Servlet实例 2.Servlet映射访问路径(可传多个)
ServletRegistrationBean<MyServlet> registrationBean =
new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
// 访问http://localhost:8080/myServlet路径
System.out.println("=========Servlet结束=========");
return registrationBean;
}
}
【方式二 】使用注解: 使用**@ServletComponentScan和@WebServlet**注解(Servlet 3.0+)
第一步: 自定义Servlet时,使用**@WebServlet**注解
java
@WebServlet(urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// super.doGet(req, resp);
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("<h1>Hello from MyServlet</h1>");
out.println("<p>当前时间: " + new Date() + "</p>");
out.flush();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// super.doPost(req, resp);
// 设置响应编码,避免中文乱码
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
// 向客户端输出响应内容
writer.write("【自定义MyServlet】请求成功!");
writer.write("<br/>请求路径:" + req.getRequestURI());
writer.flush();
writer.close();
}
}
**第二步:**在启动类上添加@ServletComponentScan
java
// 在启动类上添加@ServletComponentScan
@SpringBootApplication
@ServletComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3. SpringBoot注册Servlet的适用场景
Spring Boot默认使用嵌入式Servlet容器,并且通过自动配置注册了DispatcherServlet作为默认的Servlet。然而,在某些情况下,我们可能需要注册额外的自定义Servlet。
适用场景:
- **处理特定的URL模式:**当需要为特定的URL路径(如/legacy、/report等)提供特定的处理逻辑时,而这些逻辑不适合放在Spring MVC的控制器中。
- 与第三方库集成: 有些第三方库可能以Servlet的形式提供功能(例如,一些监控工具、文件上传组件等)。例如,H2数据库的控制台、Druid监控界面等。
- 性能考虑: 对于某些简单的请求(如健康检查、状态监控),直接使用Servlet处理可能比经过Spring MVC的完整处理链更高效。
- **迁移旧系统:**在将旧系统(基于Servlet/JSP)迁移到Spring Boot时,为了逐步迁移,可以先将已有的Servlet注册到Spring Boot中,然后逐步重构为Spring MVC的控制器。
- 特殊协议处理: 如果需要处理非HTTP协议(如WebSocket、FTP等),但运行在Servlet容器中,可能需要自定义Servlet。
- **静态资源处理:**虽然Spring Boot提供了静态资源处理,但有时可能需要更复杂的静态资源处理逻辑(如动态生成图片、PDF等),这时可以使用Servlet。
黄金法则:
默认使用Spring MVC Controller,只在有明确需求(性能、集成、特殊处理)时才考虑注册自定义Servlet。
【二】注册过滤器 - Filter
1. Filter的核心作用
Filter(过滤器)是Java Servlet规范中的一部分,它可以对HTTP请求进行预处理,也可以对HTTP响应进行后处理。Filter通常用于一些公共的处理逻辑,比如日志记录、字符编码转换、身份认证、权限检查、数据压缩等。
2. Filter的执行顺序
-
在**
doFilter方法中,调用filterChain.doFilter(request, response)**之前,是对请求的预处理。 -
调用**
filterChain.doFilter(request, response)**之后,是对响应的后处理。
3. SpringBoot注册过滤器 - Filter的方式
【方式一 】使用配置类: 使用**@Bean** 注解注册FilterRegistrationBean(可以控制顺序和URL模式)
**第一步:**自定义Filter,并实现 Filter
⭐⭐⭐注意:必须调用 Chain.doFilter(),否则请求不会继续。
java
/**
* 自定义Filter实现Filter接口,重写doFilter核心方法
* 作用:拦截指定路径的请求,打印拦截日志
*/
public class MyFilter implements Filter {
/**
* 核心拦截方法:所有被拦截的请求都会执行此方法
* @param filterChain 过滤器链:放行请求到下一个过滤器/目标资源
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器执行: 请求预处理");
// 必须调用 filterChain.doFilter(),否则请求不会继续
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("过滤器执行: 响应后处理");
}
}
第二步: 编写配置类
java
@Configuration
public class WebServerConfig {
@Bean
public FilterRegistrationBean myFilter(){
System.out.println("=========过滤器开始=========");
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
// 设置拦截路径
registrationBean.setUrlPatterns(Arrays.asList("/tx","/myServlet"));
System.out.println("=========过滤器结束=========");
return registrationBean;
}
}
【方式二 】使用注解: 使用**@Component**注解Filter类(默认拦截所有URL,顺序不确定)
第一步: 自定义Filter时,使用**@Component**注解
java
/**
* 自定义Filter实现Filter接口,重写doFilter核心方法
* 作用:拦截指定路径的请求,打印拦截日志
*/
@Component
public class MyFilter implements Filter {
// 实现同上
}
第二步: 在启动类上添加**@ServletComponentScan**
4. Filter与Interceptor的区别
| 特性 | Filter | Interceptor |
|---|---|---|
| 规范 | Servlet规范 | Spring MVC规范 |
| 作用范围 | 所有Web资源(Servlet、JSP、静态资源等) | 只针对Spring MVC的Handler(Controller) |
| 依赖 | 依赖Servlet容器 | 依赖Spring容器 |
| 获取Bean | 不能直接获取Spring Bean | 可以直接获取Spring Bean |
| 使用场景 | 字符编码、跨域、日志、安全等 | 权限验证、业务日志、性能监控等 |
黄金法则:
Filter处理HTTP协议层面的事情,Interceptor处理业务层面的事情。
【三】注册监听器 - Listener
Listener是Servlet规范中的核心组件之一,用于监听Web应用中的事件。
1. 常见的监听器类型
监听器是用来监听 Servlet 容器事件的组件。常见的监听器类型有:
-
ServletContextListener - 监听上下文生命周期
-
HttpSessionListener - 监听会话生命周期
-
ServletRequestListener - 监听请求生命周期
2. SpringBoot创建监听器 - Listener的方式
【方式一 】使用配置类: 使用**@Bean** 注解注册ServletListenerRegistrationBean
**第一步:**自定义Listener,并实现 ServletContextListener等
java
/**
* 自定义Listener
*/
public class MyListener implements ServletContextListener,
HttpSessionListener,
ServletRequestListener {
// ServletContextListener 方法
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("上下文初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("上下文销毁");
}
// HttpSessionListener 方法
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("会话创建: " + se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("会话销毁: " + se.getSession().getId());
}
// ServletRequestListener 方法
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("请求开始");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("请求结束");
}
}
第二步:编写配置类
java
@Configuration
public class WebServerConfig {
@Bean
public ServletListenerRegistrationBean<MyListener> myListener(){
System.out.println("=========监听器开始=========");
ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
System.out.println("=========监听器结束=========");
return registrationBean;
}
}
【方式二 】使用注解: 使用**@WebListener**注解Listener类
第一步: 自定义Listener时,使用**@WebListener**注解
java
/**
* 自定义Listener
*/
@WebListener
public class MyListener implements ServletContextListener,
HttpSessionListener,
ServletRequestListener {
// 实现代码同上
}
第二步: 在启动类上添加**@ServletComponentScan**
3. 典型业务场景
- 服务器启动时初始化全局数据(如加载字典数据到内存);
- 统计在线用户数(监听Session的创建/销毁);
- 监听请求创建,记录所有请求的访问日志;
- 服务器关闭时清理资源(如关闭连接池)。
黄金法则:
Listener用于监听系统级事件,在事件发生时执行全局性的、非业务逻辑的操作。
扩展:@JsonField && @DateTimeFormat
-
@JSONField:是阿里巴巴FastJSON库中的注解,用于控制Java对象与JSON字符串之间的序列化和反序列化。
-
@DateTimeFormat:是Spring框架中的注解,用于处理HTTP请求中的日期时间字符串到Java日期时间对象的转换。
@JsonField
【所属库 】@JsonField 是 FastJSON中的一个注解,属于 com.alibaba.fastjson.annotation.JSONField 包。
XML
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
【核心作用】处理 JSON ↔ Java对象 之间的转换(序列化/反序列化)。
把Java对象转成前端能看懂的JSON字符串(序列化),或把前端传的JSON字符串转回Java对象(反序列化)。
【实际应用场景】
- 设置日期字段的JSON格式(例如:把Java的Date转成2026-02-01);
- 改JSON字段名(例如:Java字段username,JSON里想叫user_name);
- 敏感信息控制(例如:身份证号:入库时使用,返回时脱敏)。
【实例 】日期格式化的配置
java
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date birth;
@DateTimeFormat(Spring框架,常被误称@DateFormat)
【所属库 】@DateTimeFormat 是 Spring Framework 中的一个注解,属于 org.springframework.format.annotation 包。
XML
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.x.x</version>
</dependency>
【核心作用 】处理 前端表单/URL参数 ↔ Java方法参数 之间的转换。
它用于在Spring MVC中格式化日期和时间字段,特别是在处理表单数据或URL参数时,将字符串参数转换为日期/时间类型(如java.util.Date、java.time.LocalDate等)。
【主要特点】
- 主要用于前端到后端的数据绑定(如请求参数、表单字段)。
- 可以注解在方法参数、字段或方法上。
- 支持多种日期时间格式,可以通过pattern属性指定。
【实例 】日期格式化的配置
java
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birth;
核心区别总览
| 维度 | @JSONField (FastJSON) | @DateTimeFormat (Spring) |
|---|---|---|
| 所属库 | 阿里巴巴 FastJSON | Spring Framework |
| 主要用途 | JSON序列化/反序列化 | HTTP请求参数绑定 |
| 应用场景 | Java对象 ↔ JSON字符串 | 字符串参数 → Java对象 |
| 作用阶段 | 对象与JSON转换时 | 请求参数绑定时 |