Spring源码如何修改Bean的属性用到的相关类

 更新时间:2024年05月16日 09:33:33   作者:信仰_273993243  
这篇文章主要介绍了Spring源码如何修改Bean的属性用到的相关类,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

关于Spring在处理Bean给属性赋值,或者执行实例化好的Bean的某些方法时,用到了好几个类,下面看下这些都是怎么实现的

一、PropertyDescriptor

PropertyDescriptor类表示JavaBean类通过存储器导出一个属性,可以通过该类,完成对实例化好的Bean的某些方法调用

比如setxx或者getxxx,比如Spring在处理带有@Autowired注解修饰的方法时,就是通过这个来完成调用的

该类常用的方法有:

Method getReadMethod() //获得用于读取属性值的方法
Method getWriteMethod() //获得用于写入属性值的方法

PropertyDescriptor的案例

1、通过反射创建TaskProvidePropsList实例

2、通过PropertyDescriptor拿属性的set方法,修改属性的值

Class clazz = Class.forName("TaskProvidePropsList");//拿到类clazz对象
Object obj = clazz.newInstance();//实例化
Field[] fields = clazz.getDeclaredFields();//拿到这个对象的所有属性字段

//写数据
for (Field f : fields) {
	//创建PropertyDescriptor对象,设置需要改动哪个类的哪个属性字段名
    PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
    Method wM = pd.getWriteMethod();//获得该属性写方法
    wM.invoke(obj, 2);//其实这里是执行目标的f.getName()属性的set方法
    //因为知道是int类型的属性,所以传个int过去就是了。。实际情况中需要判断下他的参数类型
}
//疑问如果属性字段没有set方法,是否可以执行成功?

//读数据
for (Field f : fields) {
    PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
    Method rM = pd.getReadMethod();//获得读方法
    Integer num = (Integer) rM.invoke(obj);
    System.out.println(num);
}

二、BeanWrapper和MutablePropertyValues

该2个类可以完成对已经实例化的对象属性进行设置值

BeanWrapper和MutablePropertyValues的使用案例

通过实例对象,给实例对象的属性赋值

public class TestMutablePropertyValues {
    public static void main(String[] args) {
        //Apple有2个属性id和name
        String[] properties = new String[]{"id", "name"};
        MutablePropertyValues pvs = new MutablePropertyValues();

        for(int i=0; i<properties.length; i++){
            String property = properties[i];
            String value = "test" + i;
            pvs.add(property, value);
        }

        Apple p = new Apple();//注意Apple里面属性的set和get方法不能少,不然报错
        BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(p);
        wrapper.setPropertyValues(pvs);//此时已经通过BeanWrapper 更改了Apple的实例对象属性
        System.out.println(p);
    }
} 

输出:

Apple(id=test0, name=test1)

@Override
public void setValue(final Object object, Object valueToApply) throws Exception {
	final Method writeMethod = (this.pd instanceof GenericTypeAwarePropertyDescriptor ?
			((GenericTypeAwarePropertyDescriptor) this.pd).getWriteMethodForActualAccess() :
			this.pd.getWriteMethod());
	//上面的this.pd字段,就是PropertyDescriptor类型
	final Object value = valueToApply;
	writeMethod.invoke(getWrappedInstance(), value);
}

其实底层用的就是PropertyDescriptor来处理的

Spring使用场景

那么Spring在实例化Mapper的时候,也正是通过这种方式,来完成对Bean里面的属性赋值

比如下面代码:

//mbd是Mapper转成的DB,最总得到beanInstance也就是Mapper的实例
Object beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
BeanWrapper bw = new BeanWrapperImpl(beanInstance);
initBeanWrapper(bw);
return bw;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于Java中Clonable接口和深拷贝详解

    关于Java中Clonable接口和深拷贝详解

    Cloneable是一个接口,实现这个接口后,可以在类中重写Object中的clone方法,然后通过类调用clone方法进行克隆,这篇文章主要介绍了关于Java中Clonable接口和深拷贝的相关资料,需要的朋友可以参考下
    2026-01-01
  • java连接mysql数据库及测试是否连接成功的方法

    java连接mysql数据库及测试是否连接成功的方法

    这篇文章主要介绍了java连接mysql数据库及测试是否连接成功的方法,结合完整实例形式分析了java基于jdbc连接mysql数据库并返回连接状态的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • SpringBoot监听器的实现示例

    SpringBoot监听器的实现示例

    在SpringBoot中,你可以使用监听器来响应特定的事件,本文主要介绍了SpringBoot监听器的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • hadoop 单机安装配置教程

    hadoop 单机安装配置教程

    单机安装主要用于程序逻辑调试。安装步骤基本通分布式安装,包括环境变量,主要Hadoop配置文件,SSH配置等,需要的朋友可以参考下
    2012-11-11
  • MyBatis与SpringMVC相结合实现文件上传、下载功能

    MyBatis与SpringMVC相结合实现文件上传、下载功能

    这篇文章主要介绍了MyBatis与SpringMVC相结合实现文件上传、下载功能的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • SpringBoot+slf4j实现全链路调用日志跟踪的方法(一)

    SpringBoot+slf4j实现全链路调用日志跟踪的方法(一)

    本文重点给大家介绍Tracer集成的slf4j MDC功能,方便用户在只简单修改日志配置文件的前提下输出当前 Tracer 上下文 TraceId,文章通过代码给大家讲解了在springboot中使用的技巧,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • Java并发Futures和Callables类实例详解

    Java并发Futures和Callables类实例详解

    Callable对象返回Future对象,该对象提供监视线程执行的任务进度的方法, Future对象可用于检查Callable的状态,然后线程完成后从Callable中检索结果,这篇文章给大家介绍Java并发Futures和Callables类的相关知识,感兴趣的朋友一起看看吧
    2024-05-05
  • Redis在springboot中的使用教程

    Redis在springboot中的使用教程

    这篇文章主要介绍了Redis在springboot中的使用教程,本文实例代码相结合的形式给大家介绍的非常详细,需要的朋友可以参考下
    2018-06-06
  • SQL Server 2000 Driver for JDBC Service Pack 3 安装测试方法

    SQL Server 2000 Driver for JDBC Service Pack 3 安装测试方法

    这篇文章主要介绍了数据库连接测试程序(SQL Server 2000 Driver for JDBC Service Pack 3 安装测试),需要的朋友可以参考下
    2014-10-10
  • java连接mongoDB并进行增删改查操作实例详解

    java连接mongoDB并进行增删改查操作实例详解

    这篇文章主要介绍了java连接mongoDB并进行增删改查操作,结合实例形式详细分析了java环境下MongoDB扩展包的下载、安装及操作MongoDB连接、增删改查等相关操作技巧,需要的朋友可以参考下
    2019-04-04

最新评论