使用 Lombok 的 @Accessors(chain=true) 的注意事项

news2024/12/22 23:31:58

前言

  • 大家在日常开发中想必都有使用过 Lombok 的 @Accessors(chain=true) 注解吧,这个确实有时候会让我们的get/set方法变的非常的便捷,但是从中又隐藏了一些注意细节,我们一起来看看。

注解介绍

@Accessors(chain=true)

  • 在我们的实体类或者对象中加入了该注解设置 chain=true,这样我们就可以进行链条式调用参数了。生成setter方法返回this(也就是返回的是对象),代替了默认的返回 void
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class User {
    private Integer id;
    private String name;
    private Integer age;

    // 生成的setter方法如下,方法体略
    public User setId(Integer id) {}
    public User setName(String name) {}
    public User setAge(Integer age) {}
    public static void main(String[] args) {
        //开起chain=true后可以使用链式的set
        User user = new User().setAge(31).setName("pollyduan");//返回对象
        System.out.println(user);
    }
}

@Accessors(fluent = true)

  • 与 chain=true 类似,区别在于 getter 和 setter 不带 set 和 get 前缀
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(fluent = true)
public class User {
    private Integer id;
    private String name;
    private Integer age;

    // 生成的getter和setter方法如下,方法体略
    public Integer id() {}
    public User id(Integer id) {}
    public String name() {}
    public User name(String name) {}
    public Integer age() {}
    public User age(Integer age) {}
    public static void main(String[] args) {
        //fluent=true开启后默认chain=true,故这里也可以使用链式set
        User user = new User().age(31).name("pollyduan");//不需要写set
        System.out.println(user);
    }
}

@Accessors(prefix = " f ")

  • prefix 的中文含义是前缀,用于生成 getter 和 setter 方法的字段名会忽视指定前缀(遵守驼峰命名)
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(prefix = "p")
public class User {
    private Integer pId;
    private String pName;

    // 生成的getter和setter方法如下,方法体略
    public Integer getId() {}
    public void setId(Integer id) {}
    public String getName() {}
    public void setName(String name) {}
}

对象之间的属性复制问题

		//测试使用Lombok的@Accessors(chain=true)后cglib无法复制属性问题
        ConfComponent component = new ConfComponent();
        component.setComponentCode("01").setComponentName("哈哈");

        ConfComponent c2  = new ConfComponent();
        BeanUtils.copyProperties(component,c2);
        System.out.println("spring自带属性复制:"+c2.getComponentCode()+"====="+c2.getComponentName());

        ConfComponent c3 = new ConfComponent();
        BeanUtil.copyProperties(component,c3);
        System.out.println("hutool自带:"+c3.getComponentCode()+"====="+c3.getComponentName());

        //测试使用 @Accessors(chain=true)注解的对象和不使用这个注解的对象是否可以进行属性复制
        com.dcsoft.riverlake.inspection.work.api.model.entity.A a = new com.dcsoft.riverlake.inspection.work.api.model.entity.A();
        BeanUtils.copyProperties(component,a);
        System.out.println("使用@Accessors(chain=true)注解和没使用注解对象之间的属性复制:"+a.getComponentCode()+"========="+a.getComponentName());


        //CglibUtil测试:测试结果:无法复制进去
        ConfComponent c4  = CglibUtil.copy(component,ConfComponent.class);
        System.out.println("CglibUtil测试:"+c4.getComponentCode()+"========"+c4.getComponentName());

测试结果

  • 通过测试我们可以看出,使用 @Accessors(chain=true) 注解后,除了使用 CglibUtil 工具类后无法复制成功,其他都是没有问题的
    在这里插入图片描述

结论

  • 由于 @Accessors(chain=true) 导致 set 方法返回是 this(也就是返回的是对象)而 cglib 只获取返回值是 void 类型的 set 方法,所以出现了这个问题
  • 所以我们在使用的过程中尽量使用:BeanUtil.copyProperties或者org.springframework.beans.BeanUtils.copyProperties(source, target) 这两个方法即可避免这个问题

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

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

相关文章

curl检测网页的用法

一般网页状态为200都是正常的,还有一种情况是网页做了跳转,这种情况下网页状态码为301,http的head里会有lcation记录跳转的地址 这个方法不太好用,取出来的值后面会带回车键值可以将值输出到文本里就会看到末尾有带回车键值&…

solidworks2022 - 双开

文章目录 solidworks2022 - 双开概述实验END solidworks2022 - 双开 概述 如果要参照一份设计文件, 画自己的设计. solidworks双开就有点刚需的意思了. 如果只是双击打开参考设计和自己的现有工程, 只能在一个solidworks中同时打开2份工程. 虽然可以跨区显示, 但是一份设计进…

Git很少用到但是很有用的几个命令

Git的有些命令已经融入到血液中,通常情况下大脑可能还没有想出来,键盘却已经敲出来了。 但是同样有一些Git命令,平时用不上,但真正遇到了使用场景时,却怎么也想不起来,不得不面向CSDN编程。 比如有时候git …

推荐 | 基于飞凌嵌入式i.MX8MM核心板的压力位移分析仪应用方案

来源:飞凌嵌入式官网 www.forlinx.com 随着工业制造领域的高速发展,工业生产中对于材料力学性能的要求也随之上升,因此就需要有更加精确和可靠的测量仪器来满足需求。于是压力位移分析仪应运而生,大大提高了材料测试的准确性…

【荐书】分享5种程序员需要的战略思维

⭐️ 大家好,我是爱读书的小雨青年。我很高兴参加了周掌柜《战略思维十二讲》的线下新书发布会。 ⭐️ 新书发布会分为两个部分,上半场是周掌柜本人的自我介绍,以及对本书的一些讲解。在我看来讲解程度十分细致了,周掌柜本人给人一…

[世界读书日] 最好的书,都在博雅之中

今天是世界读书日(4月23日),还是谈谈读书。 我很少看到有人说读书不好的,但很少看到有人爱读书,也很少看到有人读到了好书。 好书、好读书、读好书,都是很稀缺的。 一、好书的作用 基本上,我们遇…

项目管理中,如何拒绝客户的要求?

在生活中,我们要面对各种各样的人和事,要学如何去拒绝别人提出的要求。 这些要求,有符合我们意愿的,也有不符合我们意愿的;有我们能接受的,也有我们需要拒绝的。 这是我们日常生活的一部分,并…

IJKPLAYER源码分析-主要队列

前言 对IJKPLAYER播放器内核几个关键的队列的理解,将有助于掌控全局。因此,这里简要介绍所涉及到的几个关键队列实现: PacketQueue:压缩数据队列,是一个带有首尾指针和回收单链表头指针的单链表结构,用来实…

iptables和firewalld防火墙

安全技术和防火墙概述 安全技术 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决…

SLAM论文速递【SLAM—— 基于平面特征的动态SLAM—4.24(2)

论文信息 题目: Dynamic SLAM Based on Planar Features 基于平面特征的动态SLAM论文地址: https://ieeexplore.ieee.org/abstract/document/9834113发表期刊: 2022 7th International Conference on Automation, Control and Robotics En…

从源码全面解析 ArrayBlockingQueue 的来龙去脉

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

前缀索引,在性能和空间中寻找平衡

文章目录 1.什么是前缀索引2.什么是索引选择性3.创建前缀索引3.1 一个小案例3.2 前缀索引3.3 一个问题 4. 回到开始的问题5.小结 我们在项目的具体实践中,有时候会遇到一些比较特殊的字段,例如身份证号码。 松哥之前有一个小伙伴做黑龙江省的政务服务网&…

手持式激光焊接机多少钱一台

目前很火的一台机器,相比于传统的焊接,手持激光焊接机最大的亮点在于: 1、对于操作工人没有要求:不需要焊工证、男女老少均可 这样可以大大节省人工成本 2、焊接质量 由于他的焊接效率、操作性能比较突出,即便是第一…

C++面试指南——类常用知识点概念总结(附C++进阶视频教程)

构造函数 构造函数可以抛出异常,可以重载,如果在实例化时在类名后面加个括号,只是创建了一个匿名的对象。构造不能是虚函数,因为此时虚函数表还没有初始化。new对象会调解构造函数。没有定义拷贝构造时,IDE会自动生成…

宝塔面板安装配置MySQL,轻松管理数据库【公网远程访问】

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar内网穿透4. 创建HTTP隧道映射mysql端口5.远程连接6.固定TCP地址6.1 保留一个固定的公网TCP端口地址6.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单…

软件测试常规测试过程模型——V模型与X模型

一、V模型简单介绍及讲解 V模型是软件测试过程模型中最广为人知的模型,尽管很多富有实际经验的测试人员还是不太熟悉V模型,或者其它的模型。V模型中的过程从左到右,描述了基本的开发过程和测试行为。V模型的价值在于它非常明确地标明了测试过…

SpringBoot整合Minio,一篇带你入门使用Minio

本文介绍SpringBoot如何整合Minio,解决文件存储问题 文章目录 前言环境搭建项目环境搭建添加依赖库yml配置 Docker安装minio 代码实现MiniConfigservicecontroller 测试 前言 参考链接: 官网 环境搭建 项目环境搭建 将minio单独封装成一个module&am…

安全代码审计实施标准学习笔记

声明 本文是学习GB-T 39412-2020 信息安全技术 代码安全审计规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 资源使用安全缺陷审计列表 资源管理 审计指标:应避免重复释放资源。 审计人员应检查代码是否存在重复释放资源的情况。重…

Opencv+Python笔记(九)模板匹配

模板匹配 模板匹配常用于对象检测,且实现简单计算效率高。但如果输入图像中存在变化因素如旋转、缩放、视角变化等,模板匹配很容易失效 模板匹配原理: 1.匹配方式为模板 (a * b) 在原图像 (m * n) 上滑动 使用参数method中指定的方法&#…

云原生(docker+k8s+阿里云)

Gitee-Kubernetes学习 kubectl备忘清单 k8s官方文档-task [云原生-kubectl命令详解] ingress详解 ingress官方文档 云原生-语雀-架构师第一课 如上图,服务器有公网ip和私网ip,公网ip是外部访问服务器用的,重启一次实例就变化了,如…