Spring Boot 自动加载 Jackson 的原理及替换为 FastJSON

引言

Spring Boot 是一个用于快速构建基于 Spring 框架的应用程序的框架。它通过自动配置简化了 Spring 应用的初始设置和配置。在处理 JSON 数据时,Spring Boot 默认使用 Jackson 库来进行 JSON 的序列化和反序列化。本文是个人记录 Spring Boot 如何自动加载和配置 Jackson 库,并提供将 Jackson 替换成 FastJSON 的方法。

Jackson 简介

Jackson 是一个高性能的 JSON 处理库,广泛用于 Java 应用程序中。它提供了多种功能,包括 JSON 解析、生成、数据绑定等。Spring Boot 选择 Jackson 作为默认的 JSON 处理库,主要是因为其性能优越和功能丰富。

FastJSON 简介

FastJSON 是由阿里巴巴开发的一款高性能的 JSON 处理库,广泛应用于 Java 应用程序中。它不仅提供了 JSON 解析和生成的功能,还支持数据绑定和序列化/反序列化操作。FastJSON 的设计目标是提供高效、易用且功能丰富的 JSON 处理能力。

Spring Boot 自动配置机制

Spring Boot 的自动配置机制是其核心特性之一。通过 @EnableAutoConfiguration 注解(通常通过 @SpringBootApplication 注解间接启用),Spring Boot 会自动扫描类路径中的依赖,并根据这些依赖自动配置相应的组件。

@SpringBootApplication 注解

@SpringBootApplication 注解是一个复合注解,它包含了以下几个注解:

  • @SpringBootConfiguration:标记该类为配置类。
  • @EnableAutoConfiguration:启用自动配置。
  • @ComponentScan:启用组件扫描。

@EnableAutoConfiguration 注解

@EnableAutoConfiguration 注解是自动配置的核心。它会触发 SpringFactoriesLoader 工具类(Spring SPI),从类以及类库路径下的 META-INF/spring.factories 文件中读取所有自动配置类的名称,并将这些类注册到 Spring 容器中。

Spring SPI 与 Java SPI 机制类似。

自动加载 Jackson 的过程

1. 依赖解析

当你的项目中引入了 spring-boot-starter-web 依赖时,Maven 或 Gradle 会解析并下载 jackson-databindjackson-corejackson-annotations 等模块。这些模块是 Jackson 库的核心部分。

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

jackson 依赖tree

2. 读取 spring.factories 文件

Spring Boot 启动时,SpringFactoriesLoader 会读取 META-INF/spring.factories 文件,该文件列出了所有需要自动配置的类。在 spring-boot-autoconfigure 模块中,spring.factories 文件中包含以下内容:

properties 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
...

3. 实例化自动配置类

Spring Boot 会实例化这些自动配置类,并将其注册到 Spring 容器中。HttpMessageConvertersAutoConfiguration 类是其中一个重要的自动配置类,其中包括jackson的自动配置类,并负责配置 HTTP 消息转换器。

java 复制代码
@Configuration(proxyBeanMethods = false)  
@ConditionalOnClass(HttpMessageConverter.class)  
@Conditional(NotReactiveWebApplicationCondition.class)  
@AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.class, JsonbAutoConfiguration.class })  
@Import({ JacksonHttpMessageConvertersConfiguration.class, GsonHttpMessageConvertersConfiguration.class,  
JsonbHttpMessageConvertersConfiguration.class })  
public class HttpMessageConvertersAutoConfiguration {
    ......
}

JacksonAutoConfiguration 自动配置类 JacksonHttpMessageConvertersConfiguration 配置http消息转换器

4. 配置 MappingJackson2HttpMessageConverter

HttpMessageConvertersAutoConfiguration 类中包含了一个 MappingJackson2HttpMessageConverter 的配置。这个转换器使用 Jackson 库来处理 JSON 的序列化和反序列化。

java 复制代码
@Configuration
@ConditionalOnClass({ MediaType.class, MappingJackson2HttpMessageConverter.class })
@ConditionalOnProperty(prefix = "spring.mvc.converters.preferred-json-mapper", havingValue = "jackson", matchIfMissing = true)
public class HttpMessageConvertersAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnClass({ ObjectMapper.class })
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
        return new MappingJackson2HttpMessageConverter(objectMapper);
    }

    @Bean
    @ConditionalOnMissingBean
    public HttpMessageConverters httpMessageConverters(MappingJackson2HttpMessageConverter converter) {
        return new HttpMessageConverters(converter);
    }
}

5. 自动配置生效

HttpMessageConvertersAutoConfiguration 类被加载并实例化后,MappingJackson2HttpMessageConverter 会被添加到 Spring MVC 的消息转换器列表中。这意味着所有返回 JSON 数据的控制器方法都会自动使用 Jackson 进行序列化和反序列化。

将 Jackson 替换成 FastJSON

FastJSON 是由阿里巴巴开发的高性能 JSON 处理库,它在某些场景下比 Jackson 更快。以下是将 Spring Boot 中的 Jackson 替换成 FastJSON 的步骤。

1. 移除 Jackson 依赖

首先,需要移除 Spring Boot 项目中的 Jackson 依赖。使用 Maven 构建,可以在 pom.xml 文件中移除以下依赖:

xml 复制代码
<!-- 移除Jackson依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

2. 添加 FastJSON 依赖

然后,添加 FastJSON 的依赖:

xml 复制代码
<!-- 添加FastJSON依赖 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version> <!-- 请使用最新版本 -->
</dependency>

3. 配置 FastJSON 作为默认的 JSON 处理器

为了使 Spring Boot 使用 FastJSON 作为默认的 JSON 处理器,需要创建一个配置类来替换默认的 HttpMessageConverter

java 复制代码
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class FastJsonConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
            // 配置FastJSON的序列化特性
            com.alibaba.fastjson.serializer.SerializerFeature.WriteMapNullValue,
            com.alibaba.fastjson.serializer.SerializerFeature.WriteDateUseDateFormat
        );
        converter.setFastJsonConfig(config);
        converters.add(converter);
    }
}

4. 验证配置

创建一个简单的controller来验证 FastJSON 是否生效。

java 复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }

    @GetMapping("/user")
    public User getUser() {
        return new User("John Doe", 30);
    }
}


class User {
    private String name;
    private int age;

    public User() {}

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    //getter  setter
}

5. 运行应用

启动Spring Boot 应用,并访问 /user 接口,检查返回的 JSON 格式是否由 FastJSON 生成。

总结

Spring Boot 通过 @EnableAutoConfiguration 注解和 META-INF/spring.factories 文件自动加载和配置 Jackson 库。HttpMessageConvertersAutoConfiguration 类负责配置 MappingJackson2HttpMessageConverter,从而使 Jackson 成为默认的 JSON 处理库。也可以将 Jackson 替换成 FastJSON,以便在某些场景下获得更好的性能。


如果有任何问题或需要进一步的信息,请联系我。

相关推荐
AC赳赳老秦7 小时前
OpenClaw 多源采集公开行业数据:从原始信息到研究报告初稿的自动化实践
java·c语言·c++·python·php·deepseek·openclaw
Java成神之路-8 小时前
深入理解三大高频队列:ArrayDeque、LinkedList、PriorityQueue 方法、特性与场景选择
java
roman_日积跬步-终至千里8 小时前
【资源控制】自助查询的智能路由
java·大数据·数据库
步行cgn8 小时前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
lhldsg9 小时前
社区健身场地规划实战指南:从器材配置到智能化管理经验分享
java·开发语言·经验分享·小程序
LayZhangStrive9 小时前
后端通识 - 后端工程开发常用的流程图类别
java·流程图·后端开发
WIN赢9 小时前
【抽象思想-从复杂中抽离简单、收敛的口子】
java·前端·javascript
captain3769 小时前
多线程单例模式
java·单例模式·java-ee
xiaotianyuanma10 小时前
【计算机毕业设计】基于Spring Boot的体育馆预约系统的设计与实现
java·spring boot·课程设计
何以解忧,唯有..10 小时前
MySQL 索引分类与底层原理深度剖析
java