SpringBoot中这样用ObjectMapper

  • 每次new一个
  • 单例化
  • 个性化配置
  • 小结

你要说他有问题吧,确实能正常执行;可你要说没问题吧,在追求性能的同学眼里,这属实算是十恶不赦的代码了。

首先,让我们用JMH对这段代码做一个基准测试,让大家对其性能有个大概的了解。

基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。而JMH是一个用来构建,运行,分析Java或其他运行在JVM之上的语言的 纳秒/微秒/毫秒/宏观 级别基准测试的工具。

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Thread)
@Fork(1)
@Warmup(iterations = 5, time = 1)
@Measurement(iterations = 3, time = 1)
public class JsonJMHTest {String json = "{\"id\":122345667,\"email\":\"jianzh5@163.com\",\"price\":12.25}";UserEntity userEntity = new UserEntity(13345L,"jianzh5@163.com", BigDecimal.valueOf(12.25));/*** 测试String to Object*/@Benchmarkpublic UserEntity objectMapper2ObjTest() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();return objectMapper.readValue(json, UserEntity.class);}/*** 测试Object to String*/@Benchmarkpublic String objectMapper2StringTest() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();return objectMapper.writeValueAsString(userEntity);}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(JsonJMHTest.class.getSimpleName()).build();new Runner(opt).run();}
}

测试环境

# JMH version: 1.36
# VM version: JDK 17.0.3, OpenJDK 64-Bit Server VM, 17.0.3+7-LTS
# Mac AppleM1/16GB

测试结果

通过测试结果可以看出,每次new一个ObjectMapper,在实现字符串转对象时每秒可以完成23万多次,而实现对象转Json字符串每秒仅可完成2.7万次。

那该如何优化,提升性能呢?

单例化

老鸟们都知道,在创建工具类时要将工具类设置成单例的,这样不仅可以保证线程安全,也可以保证在系统全局只能创建一个对象,避免频繁创建对象的成本。

所以,我们可以在项目中构建一个ObjectMapper的单例类。


@Getter
public enum ObjectMapperInstance {INSTANCE;private final ObjectMapper objectMapper = new ObjectMapper();ObjectMapperInstance() {}
}

再次使用JMH对其测试:

@Benchmark
public UserEntity singleten2ObjTest() throws JsonProcessingException {ObjectMapper objectMapper = ObjectMapperInstance.INSTANCE.getObjectMapper();return objectMapper.readValue(json, UserEntity.class);}@Benchmark
public String singleten2StringTest() throws JsonProcessingException {ObjectMapper objectMapper = ObjectMapperInstance.INSTANCE.getObjectMapper();return objectMapper.writeValueAsString(userEntity);}

测试结果如下:

可以看到,使用单例模式,String转对象的方法每秒可以执行420多万次,比new ObjectMapper的方式快了18倍;而对象转String的方法每秒可以执行830万次,性能提升了300倍(看到结果的一瞬间我傻眼了,一度怀疑是写错代码了)!!!!

个性化配置

当然,在项目中使用ObjectMapper时,有时候我们还需要做一些个性化配置,比如将Long和BigDemical类型的属性都通过字符串格式进行转换,防止前端使用时丢失数值精度。

这些类型转换的格式映射都可以在单例类中配置,代码如下:

@Getter
public enum ObjectMapperInstance {INSTANCE;private final ObjectMapper objectMapper;ObjectMapperInstance() {objectMapper = new ObjectMapper();// 注册自定义模块initialize();}private void initialize() {CustomJsonModule customJsonModule = new CustomJsonModule();objectMapper.registerModule(customJsonModule);}
}

在initialize()方法中给ObjectMapper注册自定义序列化转换器。

第一行是使用注册自定义序列换转换器后的效果,给id和price字段都加上了引号。

再来一次JMH测试:

可以看到,给ObjectMapper额外注册转换类型以后性能会受到一定的影响,但对业务影响不大。(啥业务能这么高的请求~)

小结

通过上面的测试,结论已经很清晰了。使用单例模式进行字符串转对象时性能可以提升18倍,而对象转String性能快了惊人的290万倍,所以在Spring中如何正确的使用ObjectMapper不用我再说了吧~

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

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

相关文章

Leetcode—2079. 给植物浇水【中等】

2024每日刷题&#xff08;130&#xff09; Leetcode—2079. 给植物浇水 实现代码 class Solution { public:int wateringPlants(vector<int>& plants, int capacity) {int ans 0;int step 0;int cap capacity;bool flag false;for(int i 0; i < plants.siz…

用C#打造精美系统托盘消息提醒,让你的应用更具魅力

使用效果&#xff1a; 代码&#xff1a; #region 消息框变量private Timer fadeTimer; // 定义计时器private int fadeSpeed 2;//淡出速度private NotifyIcon notifyIcon;//气泡通知private int opacityLevel 10;//不透明度public enum NotificationType{Error,//错误Warning…

WIFI模块UDP电脑端调试

一&#xff0c;两端都是电脑端 1&#xff0c;电脑本机的IP地址 192.168.137.1 2&#xff0c;新建两个不同的连接&#xff0c;注意端口 二&#xff0c;WIFI 模块和电脑端连接 1&#xff0c;设置模块端目标IP和端口&#xff0c;电脑端只接收数据的话&#xff0c;IP、端口可随…

【多客开源】游戏陪玩系统,游戏陪玩源码,游戏陪玩语音社交源码运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

介绍 我们针对陪玩app源码市场的发展趋势&#xff0c;整合市面上主流陪玩app应用功能&#xff0c;自主开发了多客陪玩系统源码&#xff0c;并可为客户提供全部原生陪玩源码&#xff0c;进行二次开发&#xff0c;打造适用于线上游戏陪玩、语音聊天、心理咨询、情感陪伴等业务场…

Vue 中 $nextTick 的作用是什么?

目录 一、NextTick是什么 为什么要有nexttick 二、使用场景 三、实现原理 一、NextTick是什么 官方对其的定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM 什么意思呢&#xff1f; 我们可以理解成&#xff0c…

电动车违规停放监测摄像机

随着电动车的普及和城市交通拥堵问题的加剧&#xff0c;电动车的停放管理也成为一个亟待解决的难题。为了维护城市交通秩序和提高停车效率&#xff0c;一种名为电动车违规停放监测摄像机应运而生&#xff0c;成为城市管理的利器。这种电动车违规停放监测摄像机&#xff0c;利用…

Tcl学习笔记(四)——流程控制、过程、命名空间、访问文件

1. 流程控制 if命令 if命令后跟两个参数&#xff1a;表达式、待执行的Tcl脚本。if命令中的每一个左大括号都必须与它前一个字符同行。 有elseif和else可选子句&#xff0c;使用时与if中第二个参数的右大括号放在同一行。 switch命令 switch命令利用一个给定值与多个模式进行匹…

Py脚本_文件分类

最近发现通过Edge和chrome或者其他浏览器下载的文件都存放在一个地方就很繁琐&#xff0c;于是翻找以前的脚本来归纳这些文件&#xff0c;虽然有IDM下载独有会自动分类&#xff0c;但是相信很多同学都在一个文件里找文件&#xff0c;这次就写个Py脚本来实现这个功能。 # -*- c…

无人零售,重塑购物新纪元

在这个快节奏的时代&#xff0c;科技的每一次跃进都在悄无声息地改变着我们的生活方式。而今&#xff0c;无人零售正以雷霆之势&#xff0c;颠覆传统购物模式&#xff0c;为我们带来前所未有的便捷与智能体验。想知道无人零售如何彻底改变我们的购物方式吗&#xff1f;跟随我&a…

西安银行效益口碑双降:不良率连增,新董事长梁邦海能否救火?

撰稿|行星 来源|贝多财经 近日&#xff0c;西安银行&#xff08;SH:600928&#xff09;方面终于传来了新任掌门人的音讯。该行在2023年财报中正式宣布&#xff0c;董事会选举梁邦海为董事长&#xff0c;在监管部门核准梁邦海的任职资格后&#xff0c;梁邦海将不再担任该行行长…

【Java基础】Maven继承

1. 前言 Maven 在设计时&#xff0c;借鉴了 Java 面向对象中的继承思想&#xff0c;提出了 POM 继承思想。 2. Maven继承 当一个项目包含多个模块时&#xff0c;可以在该项目中再创建一个父模块&#xff0c;并在其 POM 中声明依赖&#xff0c;其他模块的 POM 可通过继承父模…

【源码】[完美接单]亲测双端获取通讯录、相册、短信定位源码

源码介绍 无hb源码&#xff0c;需要反编译。 此款修复了逻辑&#xff0c;现在全部能获取。包括华为鸿蒙。 安卓可获取&#xff1a;短信定位相册通讯录 IOS可获取&#xff1a;定位相册通讯录 源码截图 CD&#xff1a;获取方式联系小编 微信&#xff1a;uucodes 公众号&…

[C++核心编程-04]----C++类和对象之封装

目录 引言 正文 01-类和对象简介 02-封装简介 03-封装的意义 04-封装案例之设计学生类 05-封装的权限控制 06-struct和class的区别 总结 引言 在C中&#xff0c;类和对象是面向对象编程的基本概念&#xff0c;而封装则是面向对象编程的三大特征之一&a…

FastStone Capture 简介与常规用法

FastStone Capture 是一款功能强大的屏幕截图和视频录制软件&#xff0c;它提供了多种捕捉模式&#xff0c;包括全屏、窗口、对象、矩形区域、自由手绘区域等。除了基本的截图功能&#xff0c;FastStone Capture 还支持图像编辑、滚动截图、屏幕录像、颜色拾取、屏幕放大等高级…

【k8s多集群管理平台开发实践】十一、client-go实现读取k8s的事件信息

文章目录 简介 一.k8s读取k8s事件1.1.controllers控制器代码1.2.models模型代码 二.路由设置2.1.路由设置 三.前端代码5.1.列表部分html代码 四.完整代码4.1.控制器event.go的完整代码4.2.模型eventModel.go的完整代码 五.效果图 简介 本章节主要讲解通过client-go实现读取k8s事…

2023年度合肥市优秀知识产权服务机构评选申报主体条件、材料和时间程序须知

一、申报主体 在合肥市行政区域内登记注册的知识产权服务机构&#xff0c; 二、申报条件 (一)在合肥市登记注册时间满1年&#xff0c;营业执照经营范围包含知识产权代理、服务等相关内容; (二)在全国专利代理信息公示平台进行备案; (三)有稳定的专业服务人才队伍和服务对象…

21物联1班常用网络扫描

网络扫描 1.网络扫描概述2.网络扫描步骤及分类具体步骤 1.网络扫描概述 网络安全扫描技术是一种基于Internet远程检测目标网络或本地主机安全性脆弱点的技术。通过网络安全扫描&#xff0c;系统管理员能够发现所维护的Web服务器的各种TCP/IP端口的分配、开放的服务、Web服务软件…

量化交易:财务选股RSRS择时的策略

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 引言 本文将介绍一种结合财务指标选股和RSRS&#xff08;Risk-Adjusted Return to Strength Ratio&#xff09;择时的策略&#xff0c;旨在帮助投资者在复杂的市场环境中做出更明智的决策。 感兴趣的朋友&#xff0…

前端 | 自定义电子木鱼

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 &#x1f4da;模块实现解析 &#x1f407;html 搭个框架<!DOCTYPE html> <html lang"en"> <head>&l…

搭建电商ERP系统电商独立站最实用的电商API商品数据采集接口||电商API接口接入

通常搭建电商独立站需要接入的商品数据接口包括&#xff1a; 1. 商品信息接口&#xff1a;包括商品基本信息&#xff08;名称、描述、价格等&#xff09;、图片信息、库存信息、分类信息等。 2. 库存信息接口&#xff1a;用于同步更新商品的库存情况&#xff0c;保证实时性…