有道无术,术尚可求,有术无道,止于术。
本系列Jackson 版本 2.17.0
本系列Spring Boot 版本 3.2.4
源码地址:https://gitee.com/pearl-organization/study-jaskson-demo
文章目录
- 1. 前言
- 2. 起步依赖
- 3. 自动配置
- 3.1 JacksonProperties
- 3.2 JacksonAutoConfiguration
- 3.2.1 JacksonMixinConfiguration
- 3.2.2 JacksonObjectMapperBuilderConfiguration
- 3.2.3 JacksonObjectMapperConfiguration
- 3.2.4 ParameterNamesModuleConfiguration
- 3.2.5 Jackson2ObjectMapperBuilderCustomizerConfiguration
- 3.3 Jackson2ObjectMapperBuilderCustomizer
1. 前言
Spring Boot是当前最流行的Java应用开发框架,简化开发的同时也导致了很多开发人员只会写业务代码,并不太清楚内部组件和配置细节,一旦出问题或者需要性能优化时,就会显得无从下手。
所以推荐大家要多学习一下基础的应用框架,了解它们的详细用法和核心原理,不要太依赖于Spring Boot的自动化。
接下来我们学习Spring Boot是如何集成的Jackson,并针对开发中常见的问题进行实战演示。
2. 起步依赖
Spring Boot起步依赖(Starter Dependency)机制,针对常见场景需要的依赖进行了统一打包处理,使用时只需要引入Starter包即可。
例如针对JSON应用场景,在Spring Boot中提供了spring-boot-starter-json启动器,默认引入的JSON库是Jackson:
dependencies { api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter")) api("org.springframework:spring-web") api("com.fasterxml.jackson.core:jackson-databind") api("com.fasterxml.jackson.datatype:jackson-datatype-jdk8") api("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") api("com.fasterxml.jackson.module:jackson-module-parameter-names") }
除了jackson-databind,还引入非核心模块jackson-datatype-jdk8、jackson-datatype-jsr310、jackson-module-parameter-names,所以在Spring Boot环境中,可以直接处理LocalDateTime。
3. 自动配置
Spring Boot基于约定大于配置思想,引入了Starter包后,启动时扫描自动配置类,并自动装配声明的Bean组件,开发者无需手动进行繁琐的配置,从而提高了开发效率,降低了维护成本。
spring-boot-autoconfigure模块中包含了对Jackson的自动配置:
3.1 JacksonProperties
Spring Boot 提供了配置属性类JacksonProperties,方便我们直接在application.yml配置文件中指定一些转换策略:
全部属性配置如下:
spring: jackson: constructor-detector: EXPLICIT_ONLY # 设置日志格式化格式,配置为日期格式字符串或完全限定的日期格式类名。例如 yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss # 宽松的全局默认设置 default-leniency: true # 控制序列化期间包含的属性。使用 Jackson 的 JsonInclude.Include 枚举中的值之一进行配置。 default-property-inclusion: always # 序列化配置 ,MAP 集合 , Map serialization: EAGER_SERIALIZER_FETCH: true # 反序列化特征,Map deserialization: USE_BIG_DECIMAL_FOR_FLOATS: true # ObjectMapper/JsonMapper特征,Map mapper: AUTO_DETECT_GETTERS: true # 生成器Jsongenerator.Feature,Map generator: AUTO_CLOSE_TARGET: true # 地区 locale: zh_CN # 解析器 Map # parser: # 设置属性命名策略,对应jackson下PropertyNamingStrategy中的常量值,SNAKE_CASE-返回的json驼峰式转下划线,json body下划线传到后端自动转驼峰式 property-naming-strategy: SNAKE_CASE # 全局时区 time-zone: GMT+8 # 可见性阈值,可用于限制自动检测哪些方法(和字段)。 visibility: GETTER: ANY
3.2 JacksonAutoConfiguration
Spring Boot 提供了自动配置类JacksonAutoConfiguration,包含了多个内部配置类:
在自动配置类的static 块中,配置了两个默认特征,设置序列化日志时间不使用时间戳,并注册JsonComponentModule Bean 对象,用于注册所有@JsonComponent标识的Bean:
@AutoConfiguration @ConditionalOnClass({ObjectMapper.class}) public class JacksonAutoConfiguration { @Bean public JsonComponentModule jsonComponentModule() { return new JsonComponentModule(); } private static final Map