欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring源碼如何修改Bean的屬性用到的相關(guān)類

 更新時(shí)間:2024年05月16日 09:33:33   作者:信仰_273993243  
這篇文章主要介紹了Spring源碼如何修改Bean的屬性用到的相關(guān)類,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

關(guān)于Spring在處理Bean給屬性賦值,或者執(zhí)行實(shí)例化好的Bean的某些方法時(shí),用到了好幾個(gè)類,下面看下這些都是怎么實(shí)現(xiàn)的

一、PropertyDescriptor

PropertyDescriptor類表示JavaBean類通過存儲器導(dǎo)出一個(gè)屬性,可以通過該類,完成對實(shí)例化好的Bean的某些方法調(diào)用

比如setxx或者getxxx,比如Spring在處理帶有@Autowired注解修飾的方法時(shí),就是通過這個(gè)來完成調(diào)用的

該類常用的方法有:

Method getReadMethod() //獲得用于讀取屬性值的方法
Method getWriteMethod() //獲得用于寫入屬性值的方法

PropertyDescriptor的案例

1、通過反射創(chuàng)建TaskProvidePropsList實(shí)例

2、通過PropertyDescriptor拿屬性的set方法,修改屬性的值

Class clazz = Class.forName("TaskProvidePropsList");//拿到類clazz對象
Object obj = clazz.newInstance();//實(shí)例化
Field[] fields = clazz.getDeclaredFields();//拿到這個(gè)對象的所有屬性字段

//寫數(shù)據(jù)
for (Field f : fields) {
	//創(chuàng)建PropertyDescriptor對象,設(shè)置需要改動哪個(gè)類的哪個(gè)屬性字段名
    PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
    Method wM = pd.getWriteMethod();//獲得該屬性寫方法
    wM.invoke(obj, 2);//其實(shí)這里是執(zhí)行目標(biāo)的f.getName()屬性的set方法
    //因?yàn)橹朗莍nt類型的屬性,所以傳個(gè)int過去就是了。。實(shí)際情況中需要判斷下他的參數(shù)類型
}
//疑問如果屬性字段沒有set方法,是否可以執(zhí)行成功?

//讀數(shù)據(jù)
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個(gè)類可以完成對已經(jīng)實(shí)例化的對象屬性進(jìn)行設(shè)置值

BeanWrapper和MutablePropertyValues的使用案例

通過實(shí)例對象,給實(shí)例對象的屬性賦值

public class TestMutablePropertyValues {
    public static void main(String[] args) {
        //Apple有2個(gè)屬性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方法不能少,不然報(bào)錯(cuò)
        BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(p);
        wrapper.setPropertyValues(pvs);//此時(shí)已經(jīng)通過BeanWrapper 更改了Apple的實(shí)例對象屬性
        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);
}

其實(shí)底層用的就是PropertyDescriptor來處理的

Spring使用場景

那么Spring在實(shí)例化Mapper的時(shí)候,也正是通過這種方式,來完成對Bean里面的屬性賦值

比如下面代碼:

//mbd是Mapper轉(zhuǎn)成的DB,最總得到beanInstance也就是Mapper的實(shí)例
Object beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
BeanWrapper bw = new BeanWrapperImpl(beanInstance);
initBeanWrapper(bw);
return bw;

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 中組合模型之對象結(jié)構(gòu)模式的詳解

    Java 中組合模型之對象結(jié)構(gòu)模式的詳解

    這篇文章主要介紹了Java 中組合模型之對象結(jié)構(gòu)模式的詳解的相關(guān)資料,希望通過本文能幫助到大家理解應(yīng)用對象結(jié)構(gòu)模型,需要的朋友可以參考下
    2017-09-09
  • 如何優(yōu)雅的實(shí)現(xiàn)將Collection轉(zhuǎn)為Map

    如何優(yōu)雅的實(shí)現(xiàn)將Collection轉(zhuǎn)為Map

    這篇文章主要介紹了如何優(yōu)雅的實(shí)現(xiàn)將Collection轉(zhuǎn)為Map,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • springboot使用kafka事務(wù)的示例代碼

    springboot使用kafka事務(wù)的示例代碼

    Kafka?同數(shù)據(jù)庫一樣支持事務(wù),當(dāng)發(fā)生異常的時(shí)候可以進(jìn)行回滾,確保消息監(jiān)聽器不會接收到一些錯(cuò)誤的或者不需要的消息,本文就來介紹一下springboot使用kafka事務(wù)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • SpringBoot整合Redis使用@Cacheable和RedisTemplate

    SpringBoot整合Redis使用@Cacheable和RedisTemplate

    本文主要介紹了SpringBoot整合Redis使用@Cacheable和RedisTemplate,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • redis 使用lettuce 啟動內(nèi)存泄漏錯(cuò)誤的解決方案

    redis 使用lettuce 啟動內(nèi)存泄漏錯(cuò)誤的解決方案

    這篇文章主要介紹了redis 使用lettuce 啟動內(nèi)存泄漏錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Java實(shí)現(xiàn)將數(shù)組的元素用逗號連接的多種方法

    Java實(shí)現(xiàn)將數(shù)組的元素用逗號連接的多種方法

    在 Java 開發(fā)中,我們經(jīng)常需要將數(shù)組中的元素用逗號連接成一個(gè)字符串,這種需求在日志記錄、數(shù)據(jù)導(dǎo)出、API 響應(yīng)等場景中非常常見,本文將詳細(xì)介紹如何在 Java 中實(shí)現(xiàn)這一功能,并提供多種簡潔的方法和優(yōu)化建議,需要的朋友可以參考下
    2025-01-01
  • java使用udp實(shí)現(xiàn)簡單多人聊天功能

    java使用udp實(shí)現(xiàn)簡單多人聊天功能

    這篇文章主要為大家詳細(xì)介紹了java使用udp實(shí)現(xiàn)簡單多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Eclipse中導(dǎo)出碼云上的項(xiàng)目方法(圖文教程)

    Eclipse中導(dǎo)出碼云上的項(xiàng)目方法(圖文教程)

    下面小編就為大家?guī)硪黄狤clipse中導(dǎo)出碼云上的項(xiàng)目方法(圖文教程)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot如何使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理

    SpringBoot如何使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理

    這篇文章主要介紹了SpringBoot使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的方法詳解

    Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的方法詳解

    相信大家在操作Java的時(shí)候經(jīng)常會要在一個(gè)數(shù)組(無序)中查找元素的第一個(gè)和最后一個(gè)位置,下面這篇文章主要給大家介紹了關(guān)于Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評論