切換語言為:簡體
更換 SpringBoot 預設 JSON 工具類 Jackson 為 FastJSON

更換 SpringBoot 預設 JSON 工具類 Jackson 為 FastJSON

  • 爱糖宝
  • 2024-11-13
  • 2027
  • 0
  • 0

引言

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:啟用元件掃描。

更換 SpringBoot 預設 JSON 工具類 Jackson 為 FastJSON

@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 庫的核心部分。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


jackson 依賴tree

更換 SpringBoot 預設 JSON 工具類 Jackson 為 FastJSON

2. 讀取 spring.factories 檔案

更換 SpringBoot 預設 JSON 工具類 Jackson 為 FastJSON

Spring Boot 啟動時,SpringFactoriesLoader 會讀取 META-INF/spring.factories 檔案,該檔案列出了所有需要自動配置的類。在 spring-boot-autoconfigure 模組中,spring.factories 檔案中包含以下內容:

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 訊息轉換器。

@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 的序列化和反序列化。

@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 檔案中移除以下依賴:

<!-- 移除Jackson依賴 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>


2. 新增 FastJSON 依賴

然後,新增 FastJSON 的依賴:

<!-- 新增FastJSON依賴 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version> <!-- 請使用最新版本 -->
</dependency>


3. 配置 FastJSON 作為預設的 JSON 處理器

爲了使 Spring Boot 使用 FastJSON 作為預設的 JSON 處理器,需要建立一個配置類來替換預設的 HttpMessageConverter

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 是否生效。

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,以便在某些場景下獲得更好的效能。


作者:迷茫的李二
連結:https://juejin.cn/post/7436568496866197544

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.