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


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

相关推荐
武昌库里写JAVA3 分钟前
mysql 几种启动和关闭mysql方法介绍
java·开发语言·算法·spring·log4j
Hacker_Albert22 分钟前
OpenHarmony-1.启动流程
android·java·服务器
九圣残炎30 分钟前
【从零开始的LeetCode-算法】3345. 最小可整除数位乘积 I
java·算法·leetcode
星晨羽32 分钟前
esayExcel根据模板导出包含图片
java·开发语言·windows
真的很上进43 分钟前
⚡️如何在 React 和 Next.js 项目里优雅的使用 Zustand
java·前端·javascript·react.js·前端框架·vue·es6
喵叔哟1 小时前
重构代码之用多态替代条件逻辑
java·服务器·重构
数据小小爬虫1 小时前
使用Java爬虫获取淘宝商品类目API返回值
java·开发语言
lcz-20001 小时前
IDEA一键部署SpringBoot项目到服务器
java·spring boot·intellij-idea
尘浮生1 小时前
Java项目实战II基于微信小程序的原创音乐小程序(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·maven
蜜桃小阿雯1 小时前
JAVA开源项目 微服务在线教育系统 计算机毕业设计
java·开发语言·spring boot·微服务·java-ee·开源·maven