您的位置:首页 > 健康 > 美食 > spring模块(二)SpringBean(2)BeanWrapperImpl

spring模块(二)SpringBean(2)BeanWrapperImpl

2025/2/25 19:34:42 来源:https://blog.csdn.net/w_t_y_y/article/details/140015290  浏览:    关键词: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)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com