引言
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 库的核心部分。
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,以便在某些场景下获得更好的性能。
如果有任何问题或需要进一步的信息,请联系我。