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

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

本系列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
    • 4. 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-jdk8jackson-datatype-jsr310jackson-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:ssdate-format: yyyy-MM-dd HH:mm:ss# 宽松的全局默认设置default-leniency: true# 控制序列化期间包含的属性。使用 Jackson 的 JsonInclude.Include 枚举中的值之一进行配置。default-property-inclusion: always# 序列化配置 ,MAP 集合 , Map<SerializationFeature, Boolean>serialization:EAGER_SERIALIZER_FETCH: true# 反序列化特征,Map<DeserializationFeature, Boolean>deserialization:USE_BIG_DECIMAL_FOR_FLOATS: true# ObjectMapper/JsonMapper特征,Map<MapperFeature, Boolean>mapper:AUTO_DETECT_GETTERS: true# 生成器JsonGenerator.Feature,Map<com.fasterxml.jackson.core.JsonGenerator.Feature, Boolean>generator:AUTO_CLOSE_TARGET: true# 地区locale: zh_CN# 解析器 Map<Feature, Boolean># 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 {@Beanpublic JsonComponentModule jsonComponentModule() {return new JsonComponentModule();}private static final Map<?, Boolean> FEATURE_DEFAULTS;static {Map<Object, Boolean> featureDefaults = new HashMap();featureDefaults.put(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);featureDefaults.put(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false);FEATURE_DEFAULTS = Collections.unmodifiableMap(featureDefaults);}// 省略内部配置类
3.2.1 JacksonMixinConfiguration

内部自动配置类JacksonMixinConfiguration用于扫描@JsonMixin标识的类并注册,以支持混合注解:

	@Configuration(proxyBeanMethods = false)static class JacksonMixinConfiguration {@Beanstatic JsonMixinModuleEntries jsonMixinModuleEntries(ApplicationContext context) {List<String> packages = AutoConfigurationPackages.has(context) ? AutoConfigurationPackages.get(context): Collections.emptyList();return JsonMixinModuleEntries.scan(context, packages);}@BeanJsonMixinModule jsonMixinModule(ApplicationContext context, JsonMixinModuleEntries entries) {JsonMixinModule jsonMixinModule = new JsonMixinModule();jsonMixinModule.registerEntries(entries, context.getClassLoader());return jsonMixinModule;}}
3.2.2 JacksonObjectMapperBuilderConfiguration

内部自动配置类JacksonObjectMapperBuilderConfiguration 注册了一个多例的Jackson2ObjectMapperBuilder(用于构建ObjectMapper对象),并调用所有的定制器Jackson2ObjectMapperBuilderCustomizer进行定制化处理:

	@Configuration(proxyBeanMethods = false)@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)static class JacksonObjectMapperBuilderConfiguration {@Bean@Scope("prototype")@ConditionalOnMissingBeanJackson2ObjectMapperBuilder jacksonObjectMapperBuilder(ApplicationContext applicationContext,List<Jackson2ObjectMapperBuilderCustomizer> customizers) {Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();builder.applicationContext(applicationContext);customize(builder, customizers);return builder;}private void customize(Jackson2ObjectMapperBuilder builder,List<Jackson2ObjectMapperBuilderCustomizer> customizers) {for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) {customizer.customize(builder);}}}
3.2.3 JacksonObjectMapperConfiguration

内部自动配置类JacksonObjectMapperConfiguration 注册了一个单例的ObjectMapper Bean 对象到容器中,是使用容器中的Jackson2ObjectMapperBuilder 构建的,并且是线程安全的,所以在使用时直接使用@Autowired注入该实例即可。

	@Configuration(proxyBeanMethods = false)@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)static class JacksonObjectMapperConfiguration {@Bean@Primary // 主要的@ConditionalOnMissingBean // 在应用程序没有注册ObjectMapper时生效ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {return builder.createXmlMapper(false).build();}}
3.2.4 ParameterNamesModuleConfiguration

内部自动配置类ParameterNamesModuleConfiguration 用于注册了ParameterNamesModule

	@Configuration(proxyBeanMethods = false)@ConditionalOnClass(ParameterNamesModule.class)static class ParameterNamesModuleConfiguration {@Bean@ConditionalOnMissingBeanParameterNamesModule parameterNamesModule() {return new ParameterNamesModule(JsonCreator.Mode.DEFAULT);}}
3.2.5 Jackson2ObjectMapperBuilderCustomizerConfiguration

内部自动配置类Jackson2ObjectMapperBuilderCustomizerConfiguration的主要作用是将JacksonPropertiesModule中的配置,集成到应用环境中。

注册了一个StandardJackson2ObjectMapperBuilderCustomizer

在这里插入图片描述

StandardJackson2ObjectMapperBuilderCustomizer实现了Jackson2ObjectMapperBuilderCustomizer,所以在自动注册Jackson2ObjectMapperBuilder时,会调用customize方法,将JacksonProperties的配置项都集成到Jackson2ObjectMapperBuilder中:

在这里插入图片描述

4. Jackson2ObjectMapperBuilderCustomizer

Jackson2ObjectMapperBuilderCustomizer定制器接口,用于对Jackson2ObjectMapperBuilder的构建行为进行定制:

@FunctionalInterface
public interface Jackson2ObjectMapperBuilderCustomizer {void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder);}

他们之间的关系如下所示:
在这里插入图片描述

在实际开发中,可以注册Jackson2ObjectMapperBuilderCustomizer来配置ObjectMapper

    @Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> {builder.serializerByType(Long.class, com.fasterxml.jackson.databind.ser.std.ToStringSerializer.instance);builder.deserializerByType(Long.class,com.fasterxml.jackson.databind.ser.std.ToStringSerializer.instance);};}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/312250.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图文教程】在PyCharm中导入Conda环境

文章目录 &#xff08;1&#xff09;在Anaconda Prompt中新建一个conda虚拟环境&#xff08;2&#xff09;使用PyCharm打开需要搭建环境的项目&#xff08;3&#xff09;配置环境 &#xff08;1&#xff09;在Anaconda Prompt中新建一个conda虚拟环境 conda create - myenv py…

算法|基础算法|高精度算法

基础算法|位运算 1.高精度加法 2.高精度减法 3.高精度乘法 4.高精度除法 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 高精度加法 …

cpu调度与IO

内存中有A、B两个程序&#xff0c;CPU先依照顺序执行A&#xff0c;当CPU执行A的IO指令后&#xff0c;向磁盘发送IO请求&#xff0c;程序A进入阻塞队列中&#xff0c;等待IO过程结束。CPU此时执行程序B。DMA将磁盘中的数据copy到内存A的buff中&#xff0c;此时操作系统获取到IO任…

想开发多语言同城送餐app?这10个关键问题需详解

在当今数字化时代&#xff0c;多语言同城送餐app开发成为了引人注目的商业机会。随着人们生活节奏的加快&#xff0c;外卖行业逐渐成为人们生活中不可或缺的一部分。如果您计划开发一款多语言同城送餐app&#xff0c;必须要谨慎考虑一些关键问题&#xff0c;才能确保项目的成功…

Docker Container (容器) 常见命令

Docker 容器的生命周期 什么是容器&#xff1f; 通俗地讲&#xff0c;容器是镜像的运行实体。镜像是静态的只读文件&#xff0c;而容器带有运行时需要的可写文件层&#xff0c;并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除…

stm32实现hid鼠标

启动CubelMX 选择芯片&#xff08;直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程&#xff08;后记&#xff1a;此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文&#xff0c;以及…

飞桨Ai(二)paddle使用CPU版本可以正常识别,切换为GPU版本时无法识别结果

一、问题描述&#xff1a; 刚开始用paddle的CPU版本&#xff0c;对训练好的模型进行推理&#xff0c;正常识别出想要的结果后来尝试使用paddle的GPU版本&#xff0c;然后发现识别出来是空的 二、系统思路&#xff1a; 最终系统环境如下&#xff1a; 系统&#xff1a;win10 …

CSS3 max/min-content及fit-content、fill-available值的详解

c3中对width的值多了几个值&#xff1a;fill-available, max-content, min-content, 以及fit-content。 1.width:fill-available 我们在页面中扔一个没有其他样式的<div>元素&#xff0c;则&#xff0c;此时&#xff0c;该<div>元素的width表现就是fill-availabl…

Towards IP Geolocation Using Delay and TopologyMeasurements(TBG)(2006年)

下载地址:Towards IP geolocation using delay and topology measurements | Proceedings of the 6th ACM SIGCOMM conference on Internet measurement 被引次数:492 Katz-Bassett E, John J P, Krishnamurthy A, et al. Towards IP geolocation using delay and topology …

LVM与磁盘配额

目录 一.LVM概述 1.LVM &#xff08;Logical Vokume Manager &#xff09;逻辑卷管理 2.LVM的管理命令 3.创建并使用LVM操作步骤 二.磁盘配额概述 1.实现磁盘限额的条件 2.Linux磁盘限额的特点 3.实现磁盘配额的步骤 三.总结&#xff1a; 一.LVM概述 1.LVM &#xff…

(BERT蒸馏)TinyBERT: Distilling BERT for Natural Language Understanding

文章链接&#xff1a;https://arxiv.org/abs/1909.10351 背景 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;预训练语言模型&#xff08;如BERT&#xff09;通过大规模的数据训练&#xff0c;已在多种NLP任务中取得了卓越的性能。尽管BERT模型在语言理解和生成…

开源无需root!一款功能强悍的手机电脑同屏工具,14K star拿捏了【文末带项目源码】

现在使用最常用的设备就是手机和电脑了&#xff0c;经常会需要将手机屏幕镜像到电脑&#xff0c;或者是用电脑来操控手机等。 今天给大家安利一款功能强悍好用的工具 - QtScrcpy。 简介 QtScrcpy 是一个强大的安卓手机实时投屏到电脑的开源项目&#xff0c;可以将你的安卓手机…

ubuntu 设置 root 用户密码,创建新用户并赋权限

ubuntu 设置 root 用户密码&#xff0c;创建新用户并赋权限 在适用于 Linux 的 Windows 子系统上运行 Linux GUI 应用&#xff0c; 安装 Ubuntu-20.04 系统&#xff0c;新安装好的系统&#xff0c;设置用户名密码时&#xff0c; root 用户密码默认为空&#xff0c;这时需要设置…

jsoncpp 编译和使用

原文链接&#xff1a; jsoncpp的编译和使用 jsoncpp 编译出库文件 1.从github仓库下载 2.下载 cmake 工具 3.生成VS项目 4.编译得到需要的库文件 jsoncpp 的使用 查看原文

MySQL 基础使用

文章目录 一、Navicat 工具链接 Mysql二、数据库的使用1.常用数据类型2. 建表 create3. 删表 drop4. insert 插入数据5. select 查询数据6. update 修改数据7. delete 删除记录truncate table 删除数据 三、字段约束字段1. 主键 自增delete和truncate自增长字段的影响 2. 非空…

idea运行报错:启动命令过长

JAVA项目&#xff0c;运行的时候报错 Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun老问题了&#xff0c;记录一下 解决办法&#xff1a; 1、Edit Configurations 2、点击Modify options设置&#xff0c;勾选S…

✌粤嵌—2024/4/3—合并K个升序链表✌

代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…

Python爬虫入门教程!

什么是爬虫? 爬虫就是自动获取网页内容的程序&#xff0c;例如搜索引擎&#xff0c;Google&#xff0c;Baidu 等&#xff0c;每天都运行着庞大的爬虫系统&#xff0c;从全世界的网站中爬虫数据&#xff0c;供用户检索时使用。 爬虫流程 其实把网络爬虫抽象开来看&#xff0c;它…

Centos7下载配置jdk18与maven3.9.6【图文教程】

个人记录 进入目录 cd /usr/local/JDK下载与配置 OpenJDK官网 下载安装 wget https://download.java.net/openjdk/jdk18/ri/openjdk-1836_linux-x64_bin.tar.gz解压 tar -zxvf openjdk-1836_linux-x64_bin.tar.gz ls ls jdk-18/编辑配置文件 vim /etc/profile配置环境变…

程序员之路漫漫兮

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 ✈️如果喜欢这篇文章的话 &#x1f64f;大大们可以动动发财的小手&#x1f449;&#…