Spring框架对BeanUtils.copyProperties的优化

embedded/2024/12/22 21:06:19/

前言

在高并发环境下,我们难免要进行大量的存库操作,而一般的操作是监听kafka然后将消息转换成实体类,再使用一些orm框架(mybatis-plus,jpa等)进行入库,我们在将消息转换的时候难免要用到反射,今天我们来讲讲Spring框架中对BeanUtils.copyProperties的优化

缓存机制

Spring 的 BeanUtils 类利用了缓存机制来加速属性的访问。具体来说,它缓存了属性描述符(PropertyDescriptor)以减少反射操作的次数。每次复制属性时,它会先检查缓存,以避免重复地使用反射来获取属性描述符

java">private static final Map<Class<?>, PropertyDescriptor[]> propertyDescriptorCache =new ConcurrentHashMap<>(256);

更高效的反射操作

Spring 使用了一些优化的反射操作来提高性能,例如:

快速方法访问:使用 ReflectionUtils 提供的方法快速访问属性。
避免不必要的反射调用:通过缓存属性描述符和方法访问器,减少反射调用的开销

更灵活的类型转换

Spring 的 BeanUtils.copyProperties 支持类型转换,这意味着如果源对象和目标对象的属性类型不完全匹配,Spring 会尝试进行适当的类型转换。这是通过 Spring 的 ConversionService 实现的,它支持复杂的类型转换逻辑

更好的异常处理

Spring 的 BeanUtils 提供了更好的异常处理机制。它会捕获并处理各种可能的异常情况,并提供详细的异常信息,帮助开发者更快地发现和解决问题

支持嵌套属性复制

Spring 的 BeanUtils.copyProperties 支持嵌套属性的复制,这意味着它可以处理嵌套对象的属性复制,而不仅仅是简单属性。这使得它在处理复杂对象结构时更加灵活和方便。

支持忽略特定属性

Spring 的 BeanUtils.copyProperties 允许开发者指定在复制过程中忽略哪些属性。这对于需要部分属性复制的场景非常有用。

源码分析

以下是 Spring BeanUtils.copyProperties 方法的简化版源码,以展示其主要优化和特性:

java">public static void copyProperties(Object source, Object target) throws BeansException {copyProperties(source, target, null, (String[]) null);
}private static void copyProperties(Object source, Object target, Class<?> editable, String... ignoreProperties)throws BeansException {Assert.notNull(source, "Source must not be null");Assert.notNull(target, "Target must not be null");Class<?> actualEditable = target.getClass();if (editable != null) {if (!editable.isInstance(target)) {throw new IllegalArgumentException("Target class [" + target.getClass().getName() +"] not assignable to Editable class [" + editable.getName() + "]");}actualEditable = editable;}PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);List<String> ignoreList = (ignoreProperties != null) ? Arrays.asList(ignoreProperties) : null;for (PropertyDescriptor targetPd : targetPds) {Method writeMethod = targetPd.getWriteMethod();if (writeMethod != null && (ignoreList == null || !ignoreList.contains(targetPd.getName()))) {PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());if (sourcePd != null) {Method readMethod = sourcePd.getReadMethod();if (readMethod != null &&ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {try {if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {readMethod.setAccessible(true);}Object value = readMethod.invoke(source);if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {writeMethod.setAccessible(true);}writeMethod.invoke(target, value);} catch (Throwable ex) {throw new FatalBeanException("Could not copy property '" + targetPd.getName() + "' from source to target", ex);}}}}}
}

http://www.ppmy.cn/embedded/51271.html

相关文章

html做一个画热图的软件

完整示例 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>热图生成器</title><script src"https://cdn.plot.ly/plotly-latest.min.js"></script><style>body …

Hi3861 OpenHarmony嵌入式应用入门--基于HI-12F开发板烧写程序

首先需要一个开发板&#xff0c;我已经在嘉立创上进行了开源&#xff0c;基于安信可hi-12f模块的开发板&#xff0c;集成了两个按键&#xff0c;一个三色灯&#xff0c;一个滑动变阻器&#xff0c;可外接一个0.96寸液晶。 【HI-12F】基于安信可hi-12f模块的开发板 - 嘉立创EDA…

SpringSecurity6从入门到实战之自定义登录页面

SpringSecurity6从入门到实战之自定义登录页面 在使用SpringSecurity进行认证操作的时候,可以发现默认提供的登录页面比较简陋.那么我们能否对登录页面进行自定义配置呢?接下来开始讲解应该如何进行配置 自定义登录页面流程 引入模板依赖 由于自定义登录页面会使用到前端相关…

Centos7防火墙firewal常用命令介绍

前言 在CentOS 7中&#xff0c;firewalld是默认的防火墙管理工具&#xff0c;它提供了一种简化和易于使用的方法来配置和管理防火墙规则。 firewalld简介 引入&#xff1a;从CentOS 7开始&#xff0c;默认使用firewalld来配置防火墙&#xff0c;而不是传统的iptables。配置文…

Ansible Automation Platform(RHAAP2)架构中的四种节点及配置

在清单文件inventory中配置 #自动化控制节点设置 [automationcontroller] example.com #默认为混合节点 control.example node_typecontrol #作为控制节点&#xff0c;仅负责自动化的平台运行 hybrid.example node_typehybrid #作为混合节点&#xff0c;即是自动化平台又是任…

【设计模式深度剖析】【9】【行为型】【访问者模式】| 以博物馆的导览员为例加深理解

&#x1f448;️上一篇:备忘录模式 | 下一篇:状态模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 访问者模式定义英文原话直译如何理解呢&#xff1f; 访问者模式的角色类图代码示例 访问者模式的应用优点缺点使用场景 示例解析:博物馆的导览员代码示例 访问…

React+TS前台项目实战(十三)-- 全局常用响应式加载动画Loading组件封装

文章目录 前言Loading组件1. 功能分析2. 代码详细注释3. 使用方式4. 不同尺寸loading动画效果展示 总结 前言 高阶组件有几大优点&#xff0c;其中一个就是渲染劫持&#xff0c;如懒加载&#xff0c;是否显示该元素loading&#xff0c;这在项目中我们经常用到。毫无疑问&#…

谈谈面试常考题:懒加载,防抖,节流(方法实现详解)

前言 最近在学习中确实收获了挺多东西&#xff0c;其中我觉得有必要拿来进行分享一下的就是懒加载了&#xff0c;还有相关的防抖和节流。因为在浏览器中这些都是属于很常见的性能优化&#xff0c;面试也是常考题。话不多说&#xff0c;速度发车。 什么是懒加载&#xff1f;懒…