spring模块(二)SpringBean(2)BeanWrapperImpl

一、介绍

1、简介

BeanWrapper是Spring中一个很重要的接口,Spring在通过配信息创建对象时,第一步首先就是创建一个BeanWrapper。

Spring低级JavaBeans基础设施的中央接口。通常来说并不直接使用BeanWrapper,而是借助BeanFactory或者DataBinder来一起使用,BeanWrapper对Spring中的Bean做了包装,为的是更加方便的操作Bean中的属性。

2、继承关系
3、Java中的内置机制

首先可以先了解下JavaBean的概念:一种特殊的类,主要用于传递数据信息。这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规范。如果两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object),或"VO"。

因此JavaBean都有如下几个特征:

  1. 属性都是私有的
  2. 有无参的public构造方法
  3. 对私有属性根据需要提供公有的getXxx方法以及setXxx方法
  4. getters必须有返回值没有方法参数,setter没有返回值,有方法参数

符合这些特征的类,被称为JavaBean,JDK提供了一套API用来访问某个属性的getter/setter方法,这些API存放在java.beans中,这就是内省(Introspector)。

4、内省和反射的区别

反射:java反射机制是在运行中,对任意一个类,能够获取得到这个类的所有属性和方法,它针对的是任意类。

内省:是java语言对JavaBean类属性,事件的处理方法。

  1. 反射可以操作各种类的属性,而内省只是通过反射来操作JavaBean的属性
  2. 内省设置属性值肯定会调用setter方法,反射可以不用(反射可以直接操作属性Field)
  3. 反射就像镜子,然后能看到.class的所有,是客观的事实。内省更像主观的判断:比如看到getName(),内省就会认为这个类中有name字段,但事实上并不一定会有name。通过内省可以获取bean的getter/setter

二、定义

1、PropertyDescriptor

属性描述符,能够描述JavaBean中的属性,通过属性描述符我们能知道这个属性的类型,获取操纵属性的方法(getter/setter)

三、demo

1、获取对象原值与设置新值
@Testpublic void user(){UserDTO userDTO = UserDTO.builder().age(18).id("1").name("zs").build();BeanWrapperImpl beanWrapper = new BeanWrapperImpl(userDTO);PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {String fieldName = propertyDescriptor.getName();Object fieldValue = beanWrapper.getPropertyValue(fieldName);log.info("old:fieldName={},fieldValue={}", fieldName, fieldValue);//重新设置值if(!"class".equals(fieldName) && fieldValue instanceof String){beanWrapper.setPropertyValue(fieldName, "new"+fieldValue);}}log.info("new userDTO={}",userDTO);}

执行输出:

2024-06-27T17:18:01.278+08:00  INFO 53196 --- [           main] com.example.bean.UserTest                : old:fieldName=age,fieldValue=18
2024-06-27T17:18:01.279+08:00  INFO 53196 --- [           main] com.example.bean.UserTest                : old:fieldName=class,fieldValue=class org.example.bean.dto.UserDTO
2024-06-27T17:18:01.280+08:00  INFO 53196 --- [           main] com.example.bean.UserTest                : old:fieldName=id,fieldValue=1
2024-06-27T17:18:01.280+08:00  INFO 53196 --- [           main] com.example.bean.UserTest                : old:fieldName=name,fieldValue=zs
2024-06-27T17:18:01.280+08:00  INFO 53196 --- [           main] com.example.bean.UserTest                : new userDTO=UserDTO(id=new1, name=newzs, age=18)

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

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

相关文章

eFuse基本概念

From:GTP-4o eFuse(电子熔丝)是一种在集成电路(IC)设计中常用的可编程熔丝技术。它在芯片中起着至关重要的作用,主要用于配置、调整、修复和安全相关的功能。以下是关于 eFuse 在芯片中的用途和相关技术的…

学习一下宏的##和...

##:如果参数不存在则忽略逗号和参数 ...:可变参数 栗子: #define Debug(fmt, args...) LOG("DEBUG", fmt, ##args) ...: ... 是C和C预处理器中的一个特殊标记,用于表示一个可变数量的参数。在宏定义中,可…

【课程总结】Day13(上):使用YOLO进行目标检测

前言 在上一章《【课程总结】Day11(下):YOLO的入门使用》的学习中,我们通过YOLO实现了对图片的分类任务。本章的学习内容,将以目标检测为切入口,了解目标检测流程,包括:数据标准、模…

使用NFS网关功能将HDFS挂载到本地系统

HDFS安装教程 HDFS安装教程http://t.csdnimg.cn/2ziFd 使用NFS网关功能将HDFS挂载到本地系统 简介 HDFS提供了基于NFS(Network File System)的插件,可以对外提供NFS网关,供其它系统挂载使用。 NFS 网关支持 NFSv3,并…

【操作系统】进程管理——进程的概念、组成和特征(个人笔记)

学习日期:2024.6.29 内容摘要:进程的基本概念和特征、状态和转换 进程的概念 程序与进程 程序:是静态的,是存放在磁盘里的可执行文件,就是一系列的指令集合 进程(Process):是动态…

GPT-5:下一代AI如何彻底改变我们的未来

GPT-5 发布前瞻:技术突破与未来展望 随着科技的飞速发展,人工智能领域不断迎来新的突破。根据最新消息,OpenAI 的首席技术官米拉穆拉蒂在一次采访中确认,GPT-5 将在一年半后发布,并描述了其从 GPT-4 到 GPT-5 的飞跃如…

Linux随记(十)

一、升级harbor v2.6.4 --> harbor-offline-installer-v2.11.0-rc3 --> v2.9.4 – 随记 漏洞信息: CVE-2023-20902timing condition in Harbor 2.6.x and below, Harbor 2.7.2 and below, Harbor 2.8.2 and below, and Harbor 1.10.17 and below allows an…

js自定义内容生成二维码,qrcodejs的使用

qrcodejs qrcodejs是基于原生js的文本转换成二维码的库&#xff0c;轻量且使用方法简单&#xff0c;它的实现原理是通过canvas将重新编码的内容绘制在页面元素上&#xff0c; 使用qrcodejs时可以选择引入它的cdn或者使用npm下载 <script type"text/javascript" …

Linux的IO易错点总结

本文主要记录IO的一些易错操作。 阻塞IO和非阻塞IO&#xff0c;一般都是针对数据读取的&#xff0c;因为write是主动行为&#xff0c;不存在阻塞这一说。 非阻塞式IO&#xff0c;一般都要配合while轮询来读取数据。 IO多路复用 当只检测一路IO的时候&#xff0c;和普通IO的作…

软考满分范文“论模型驱动架构设计方法及其应用”,软考高级,系统架构设计师

论文真题 模型驱动架构设计是一种用于应用系统开发的软件设计方法,以模型构造、模型转换和精化为核心,提供了一套软件设计的指导规范。在模型驱动架构环境下,通过创建出机器可读和高度抽象的模型实现对不同问题域的描述,这些模型独立于实现技术,以标准化的方式储存,利用…

linux unzip指令

在Linux中&#xff0c;unzip 命令通常用于解压 .zip 文件。默认情况下&#xff0c;unzip 命令会输出解压过程中的一些信息&#xff0c;但不会生成一个完整的报告。但是&#xff0c;你可以通过重定向输出和结合其他命令来生成一个更详细的报告。 以下是一些方法来使用 unzip 命…

鸿蒙开发Ability Kit(程序框架服务):【向用户申请授权】

向用户申请授权 当应用需要访问用户的隐私信息或使用系统能力时&#xff0c;例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等&#xff0c;应该向用户请求授权&#xff0c;这部分权限是user_grant权限。 当应用申请user_grant权限时&#xff0c;需要完成以下步骤&a…

[AIGC] 深入理解 Crontab:定时任务的艺术

在 Unix 或者 Linux 环境下&#xff0c;有一种被广泛使用的工具可以帮助我们自动执行定时任务&#xff0c;那就是 crontab。本篇文章将带你详细了解 crontab 的相关知识。 文章目录 1. 什么是 Crontab2. Crontab 的结构3. 如何使用 Crontab4. 注意事项 相关疑问1. crontab的系统…

6.The hardest part about learing hard things(学一件难的事,难在哪里)

I’ve been recording a lot of podcast interviews for my upcoming book, Ultralearning.One of the reurring themes I’ve noticed in our conversations is that how people feel about learning is the overwhelming cause of the results they experience. 我为我的新书…

IOS越狱源集合(2024)

常用源 https://wwg135.github.io https://huayuarc.cn/ https://cydia.akemi.ai/ https://laileld.github.io/repo https://themepro.yourepo.com/ https://apt.geometricsoftware.se/ https://repo.anthopak.dev https://www.yourepo.com/ https://julio.hackyouriphone.org…

[leetcode]beautiful-arrangement. 优美的排列

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> match;vector<int> vis;int num;void backtrack(int index, int n) {if (index n 1) {num;return;}for (auto &x : match[index]) {if (!vis[x]) {vis[x] tru…

python工程打包成exe

1. 使用PyInstaller PyInstaller是打包Python程序最流行的工具之一&#xff0c;它可以生成独立可执行的程序。 参数及其作用&#xff1a; 打包类型&#xff1a; - -F, --onefile&#xff1a;生成单个可执行文件。 - -D, --onedir&#xff1a;生成包含多个文件的可执行目录&am…

深入解析高斯过程:数学理论、重要概念和直观可视化全解

与其他算法相比&#xff0c;高斯过程不那么流行&#xff0c;但是如果你只有少量的数据&#xff0c;那么可以首先高斯过程。在这篇文章中&#xff0c;我将详细介绍高斯过程。并可视化和Python实现来解释高斯过程的数学理论。 多元高斯分布 多元高斯分布是理解高斯过程所必须的概…

flink使用StatementSet降低资源浪费

背景 项目中有很多ods层&#xff08;mysql 通过cannal&#xff09;kafka&#xff0c;需要对这些ods kakfa做一些etl操作后写入下一层的kafka&#xff08;dwd层&#xff09;。 一开始采用的是executeSql方式来执行每个ods→dwd层操作&#xff0c;即类似&#xff1a; def main(…

MySQL影院订票系统

DDL -- 影院表 CREATE TABLE Theaters (TheaterID INT PRIMARY KEY,Name VARCHAR(100),Address VARCHAR(200) );-- 电影表 CREATE TABLE Movies (MovieID INT PRIMARY KEY,Title VARCHAR(100),ReleaseDate DATE );-- 放映场次表 CREATE TABLE Showings (ShowingID INT PRIMARY…