Jackson 2.x 系列【25】Spring Boot 集成之起步依赖、自动配置

慈云数据 2024-04-27 技术支持 63 0

有道无术,术尚可求,有术无道,止于术。

本系列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
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon