最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、PropertyDescriptor

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

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

該類(lèi)常用的方法有:

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

PropertyDescriptor的案例

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

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

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

//寫(xiě)數(shù)據(jù)
for (Field f : fields) {
	//創(chuàng)建PropertyDescriptor對(duì)象,設(shè)置需要改動(dòng)哪個(gè)類(lèi)的哪個(gè)屬性字段名
    PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
    Method wM = pd.getWriteMethod();//獲得該屬性寫(xiě)方法
    wM.invoke(obj, 2);//其實(shí)這里是執(zhí)行目標(biāo)的f.getName()屬性的set方法
    //因?yàn)橹朗莍nt類(lèi)型的屬性,所以傳個(gè)int過(guò)去就是了。。實(shí)際情況中需要判斷下他的參數(shù)類(lèi)型
}
//疑問(wèn)如果屬性字段沒(méi)有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è)類(lèi)可以完成對(duì)已經(jīng)實(shí)例化的對(duì)象屬性進(jìn)行設(shè)置值

BeanWrapper和MutablePropertyValues的使用案例

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

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)通過(guò)BeanWrapper 更改了Apple的實(shí)例對(duì)象屬性
        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類(lèi)型
	final Object value = valueToApply;
	writeMethod.invoke(getWrappedInstance(), value);
}

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

Spring使用場(chǎng)景

那么Spring在實(shí)例化Mapper的時(shí)候,也正是通過(guò)這種方式,來(lái)完成對(duì)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)文章

  • 關(guān)于Java中Clonable接口和深拷貝詳解

    關(guān)于Java中Clonable接口和深拷貝詳解

    Cloneable是一個(gè)接口,實(shí)現(xiàn)這個(gè)接口后,可以在類(lèi)中重寫(xiě)Object中的clone方法,然后通過(guò)類(lèi)調(diào)用clone方法進(jìn)行克隆,這篇文章主要介紹了關(guān)于Java中Clonable接口和深拷貝的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • java連接mysql數(shù)據(jù)庫(kù)及測(cè)試是否連接成功的方法

    java連接mysql數(shù)據(jù)庫(kù)及測(cè)試是否連接成功的方法

    這篇文章主要介紹了java連接mysql數(shù)據(jù)庫(kù)及測(cè)試是否連接成功的方法,結(jié)合完整實(shí)例形式分析了java基于jdbc連接mysql數(shù)據(jù)庫(kù)并返回連接狀態(tài)的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • SpringBoot監(jiān)聽(tīng)器的實(shí)現(xiàn)示例

    SpringBoot監(jiān)聽(tīng)器的實(shí)現(xiàn)示例

    在SpringBoot中,你可以使用監(jiān)聽(tīng)器來(lái)響應(yīng)特定的事件,本文主要介紹了SpringBoot監(jiān)聽(tīng)器的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • hadoop 單機(jī)安裝配置教程

    hadoop 單機(jī)安裝配置教程

    單機(jī)安裝主要用于程序邏輯調(diào)試。安裝步驟基本通分布式安裝,包括環(huán)境變量,主要Hadoop配置文件,SSH配置等,需要的朋友可以參考下
    2012-11-11
  • MyBatis與SpringMVC相結(jié)合實(shí)現(xiàn)文件上傳、下載功能

    MyBatis與SpringMVC相結(jié)合實(shí)現(xiàn)文件上傳、下載功能

    這篇文章主要介紹了MyBatis與SpringMVC相結(jié)合實(shí)現(xiàn)文件上傳、下載功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • SpringBoot+slf4j實(shí)現(xiàn)全鏈路調(diào)用日志跟蹤的方法(一)

    SpringBoot+slf4j實(shí)現(xiàn)全鏈路調(diào)用日志跟蹤的方法(一)

    本文重點(diǎn)給大家介紹Tracer集成的slf4j MDC功能,方便用戶在只簡(jiǎn)單修改日志配置文件的前提下輸出當(dāng)前 Tracer 上下文 TraceId,文章通過(guò)代碼給大家講解了在springboot中使用的技巧,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Java并發(fā)Futures和Callables類(lèi)實(shí)例詳解

    Java并發(fā)Futures和Callables類(lèi)實(shí)例詳解

    Callable對(duì)象返回Future對(duì)象,該對(duì)象提供監(jiān)視線程執(zhí)行的任務(wù)進(jìn)度的方法, Future對(duì)象可用于檢查Callable的狀態(tài),然后線程完成后從Callable中檢索結(jié)果,這篇文章給大家介紹Java并發(fā)Futures和Callables類(lèi)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2024-05-05
  • Redis在springboot中的使用教程

    Redis在springboot中的使用教程

    這篇文章主要介紹了Redis在springboot中的使用教程,本文實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06
  • SQL Server 2000 Driver for JDBC Service Pack 3 安裝測(cè)試方法

    SQL Server 2000 Driver for JDBC Service Pack 3 安裝測(cè)試方法

    這篇文章主要介紹了數(shù)據(jù)庫(kù)連接測(cè)試程序(SQL Server 2000 Driver for JDBC Service Pack 3 安裝測(cè)試),需要的朋友可以參考下
    2014-10-10
  • java連接mongoDB并進(jìn)行增刪改查操作實(shí)例詳解

    java連接mongoDB并進(jìn)行增刪改查操作實(shí)例詳解

    這篇文章主要介紹了java連接mongoDB并進(jìn)行增刪改查操作,結(jié)合實(shí)例形式詳細(xì)分析了java環(huán)境下MongoDB擴(kuò)展包的下載、安裝及操作MongoDB連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04

最新評(píng)論

邻水| 乾安县| 上林县| 灵丘县| 海安县| 高邮市| 舟曲县| 诸暨市| 乌苏市| 鄂托克旗| 固阳县| 凉城县| 景宁| 繁峙县| 孟州市| 鄄城县| 江山市| 上饶县| 攀枝花市| 罗山县| 乐清市| 桑日县| 马山县| 托克托县| 华蓥市| 城市| 聊城市| 旌德县| 宁阳县| 博野县| 治县。| 五峰| 韩城市| 安溪县| 鹤壁市| 竹山县| 枣强县| 安达市| 泸州市| 大足县| 内黄县|