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

news2024/12/24 2:34:15

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

本系列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:ss
    date-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 {

    @Bean
    public 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 {
		@Bean
		static JsonMixinModuleEntries jsonMixinModuleEntries(ApplicationContext context) {
			List<String> packages = AutoConfigurationPackages.has(context) ? AutoConfigurationPackages.get(context)
					: Collections.emptyList();
			return JsonMixinModuleEntries.scan(context, packages);
		}
		@Bean
		JsonMixinModule 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")
		@ConditionalOnMissingBean
		Jackson2ObjectMapperBuilder 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
		@ConditionalOnMissingBean
		ParameterNamesModule 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

    @Bean
    public 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.coloradmin.cn/o/1601618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

负载均衡集群——HAProxy

目录 1 HAProxy介绍 2 功能简介 3 实验组网介绍 4 实验步骤 4.1 通过 HAProxy 实现简单负载均衡调度功能 步骤 1 安装 HAProxy 步骤 2 修改配置 HAProxy 文件 4.2 HAProxy 监控页面配置 步骤 1 修改 HAProxy 配置文件 步骤 2 查看监控页面 3.3 HAProxy 日志相关配置 …

超详细!Python中 pip 常用命令

相信对于大多数熟悉Python的人来说&#xff0c;一定都听说并且使用过pip这个工具&#xff0c;但是对它的了解可能还不一定是非常的透彻&#xff0c;今天小编就来为大家介绍10个使用pip的小技巧&#xff0c;相信对大家以后管理和使用Python当中的标准库会有帮助。 安装 当然在…

论文解读:FREE LUNCH FOR FEW-SHOT LEARNING: DISTRIBUTION CALIBRATION

文章汇总 问题 学习到的模型很容易因为只有少数训练样本形成的有偏分布而变得过拟合。 动机 我们假设特征表示中的每个维度都遵循高斯分布&#xff0c;因此分布的均值和方差可以借鉴类似类的均值和方差&#xff0c;这些类的统计量可以通过足够数量的样本得到更好的估计。 …

PHP反序列化命令执行+PHP反序列化POP大链 +PHP反序列化基础

[题目信息]&#xff1a; 题目名称题目难度PHP反序列化命令执行1 [题目考点]&#xff1a; 反序列化命令执行&#xff0c;获取题目flag。[Flag格式]: SangFor{t5euvZ_OB8Jd_h2-}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 docker-compose up …

ArcGIS三维景观分层显示

今天将向大家介绍的事在ArcGIS中如何创建多层三维显示。 地表为影像的 地表为地形晕渲的 在土壤分层、油气分层等都有着十分重要的应用。下面我们具体来看看实现过程 一、 准备数据及提取栅格范围 我们这次准备的数据是之前GIS100例-30讲的案例数据。《ArcGIS三维影像图剖面图…

【网站项目】学习资料销售平台 小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

用c++写一个代码解析器需要向哪方面学习?

我以前在中小游戏公司工作的时候&#xff0c;其中一项比较琐碎的工作就是为游戏项目建库建表&#xff0c;主要是为了做数据分析。作为一个职能部门的打杂PHP&#xff0c;对游戏业务并没有什么发言权&#xff0c;但是每次建库建表&#xff0c;却是苦不堪言。 同时部门的基础设施…

EPP和EDR是什么,如何提高端点安全性

端点保护平台&#xff08;EPP&#xff09;和端点检测和响应&#xff08;EDR&#xff09;工具是两种常用于保护端点系统免受威胁的安全产品。EPP 是一种全面的安全解决方案&#xff0c;提供一系列功能来检测和防止对端点设备的威胁。同时&#xff0c;EDR专门用于实时监控、检测和…

CC254X 8051芯片手册介绍

1 8051CPU 8051是一种8位元的单芯片微控制器&#xff0c;属于MCS-51单芯片的一种&#xff0c;由英特尔(Intel)公司于1981年制造。Intel公司将MCS51的核心技术授权给了很多其它公司&#xff0c;所以有很多公司在做以8051为核心的单片机&#xff0c;如Atmel、飞利浦、深联华等公…

AI讲师大模型培训老师叶梓:大模型应用的方向探讨

大模型应用的关键方向及其落地案例可以从多个角度进行探讨&#xff0c;结合最新的研究和实际应用案例&#xff0c;我们可以更全面地理解这些技术如何推动社会和经济的发展。 Agent&#xff08;数字代理&#xff09;: 方向说明:Agent方向的AI技术旨在创建能够独立执行任务、做出…

redis_watchDog机制

文章目录 介绍机制介绍任务开始任务释放 介绍 redis的watchDog机制实现了超时续约的功能&#xff0c;简单来说就是在获取锁成功以后&#xff0c;开启一个定时任务&#xff0c;这个任务每隔一段时间(relaseTime / 3)&#xff0c;重置超时时间&#xff0c;避免的因业务阻塞导致锁…

比特币L2项目主网密集上线:新业态背后的挑战与机遇

随着加密货币行业的快速发展&#xff0c;比特币Layer 2&#xff08;以下简称L2&#xff09;项目的主网密集上线成为了近期的热点话题。这一潮流不仅是对比特币网络扩展的重要里程碑&#xff0c;也为新的商业模式和生态系统带来了无限可能。然而&#xff0c;随之而来的是各种挑战…

支付宝支付之SpringBoot整合支付宝入门

支付宝支付 对接流程 申请阿里支付官方企业账号配置应用签约产品获取RSAKey&#xff08;非对称加密&#xff09;必须获得两个加密串&#xff1a;一个公钥&#xff0c;一个密钥SDK功能开发业务对接支付回调支付组件 核心所需的参数 APPID商家私钥支付宝公钥支付回调地址网关…

实战纪实 | 学工平台平行越权

一.账号密码可爆破&#xff08;无验证码&#xff09; 1.学校学工平台用于请假跟每日上报健康信息&#xff0c;登录框如下&#xff1a; 2.经过测试发现这里不存在验证码验证&#xff0c;并且存在初始密码&#xff0c;可以尝试使用默认密码爆破账号&#xff1a; 3.经测试&#x…

【无标题】PHP-parse_str变量覆盖

[题目信息]&#xff1a; 题目名称题目难度PHP-parse_str变量覆盖1 [题目考点]&#xff1a; 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值&#xff0c;一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有&#xff1a;$$&…

自动化测试Selenium(3)

目录 WebDriver相关API 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器的宽,高 操作浏览器的前进, 后退, 刷新 控制浏览器滚动条 键盘事件 键盘单键用法 键盘组合按键用法 鼠标事件 WebDriver相关API 打印信息 打印title 即打印该网址的标题.…

护网行动 | 蓝队应急响应流程概述

了解蓝队应急响应的流程 应急响应通常是指为了应对各种意外事件发生前所做的准备&#xff0c;以及在意外事件发生后所采取的措施。 网络安全应急响应是指对已经发生或可能发送的安全事件进行监控、分析、协调、处理、保护资产安全。 网络安全应急响应主要是为了让人们对网络安全…

idea2023专业版安装破解+maven配置教程

前言 上一篇文章已经介绍了maven在Win10系统的安装配置教程。基于Win10的maven配置环境&#xff0c;本篇文章将介绍idea2023的安装破解教程及maven在idea2023的配置教程&#xff08;同时会将maven在idea2023的配置教程内容补充至上一篇文章&#xff09;。 一、idea2023下载安…

【学习】jemter中如何高效使用正则表达式

在Jemter的世界里&#xff0c;正则表达式无疑是一把锐利的剑&#xff0c;它可以帮助我们轻松地解决许多问题。在Jemter的性能测试过程中&#xff0c;我们常常需要提取响应中的某些数据&#xff0c;以便在后续的请求中使用。这时&#xff0c;正则表达式就派上用场了。通过学习如…

Linux进阶篇:Centos7搭建smb服务

Centos7搭建smb服务 1 smb介绍 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c;它为局域…