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,以便在某些场景下获得更好的性能。


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

相关推荐
winks34 分钟前
Spring Task的使用
java·后端·spring
秋意钟15 分钟前
Spring新版本
java·后端·spring
椰椰椰耶17 分钟前
【文档搜索引擎】缓冲区优化和索引模块小结
java·spring·搜索引擎
mubeibeinv19 分钟前
项目搭建+图片(添加+图片)
java·服务器·前端
青莳吖20 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall27 分钟前
期末考学C
java·开发语言
重生之绝世牛码29 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行35 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Allen Bright42 分钟前
Spring Boot 整合 RabbitMQ:手动 ACK 与 QoS 配置详解
spring boot·rabbitmq·java-rabbitmq
新手小袁_J1 小时前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11