引言
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-databind
、jackson-core
和 jackson-annotations
等模組。這些模組是 Jackson 庫的核心部分。
<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
檔案中包含以下內容:
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