Dubbo原始碼分析之擴充套件機制(3)

2021-09-24 06:58:12 字數 3320 閱讀 1316

獲取到自適應型別後進行例項化並且進行屬性注入,這裡會判斷物件工廠是否為空,當型別type為extensionfactory時會為空,也就是不會注入屬性,它的自適應型別為adaptiveextensionfactory,所以其他型別的objectfactory就是adaptiveextensionfactory

private t injectextension(t instance)  to see if we need auto injection for this property

*/if (method.getannotation(disableinject.class) != null)

class<?> pt = method.getparametertypes()[0];

if (reflectutils.isprimitives(pt))

try

} catch (exception e) }}

}} catch (exception e)

return instance;

}

判斷是否是set方法

private boolean issetter(method method)
判斷是否不需要注入

if (method.getannotation(disableinject.class) != null)
判斷引數是否是基本型別

public static boolean isprimitives(class<?> cls) 

return isprimitive(cls);

}public static boolean isprimitive(class<?> cls)

獲取屬性名字

private string getsetterproperty(method method)
在自適應擴充套件工廠初始化時會載入所有的物件工廠,這裡有spiextensionfactory和springextensionfactory

public adaptiveextensionfactory() 

factories = collections.unmodifiablelist(list);

}

獲取支援的擴充套件名字

public setgetsupportedextensions()
根據型別和名字從物件工廠中獲取擴充套件

public t getextension(classtype, string name) 

}return null;

}

因為我們的擴充套件都帶有spi註解,所以都會使用spiextensionfactory,直接返回各自型別的自適應類,最後通過反射注入對應的屬性資訊。

public t getextension(classtype, string name) 

}return null;

}

獲取指定名字的例項

public t getextension(string name) 

if ("true".equals(name))

holderholder = getorcreateholder(name);

object instance = holder.get();

if (instance == null) }}

return (t) instance;

}

判斷快取中是否含有該例項資訊

private holdergetorcreateholder(string name) 

return holder;

}

建立該例項,獲取該名字的型別資訊,獲取快取中的型別例項資訊,注入需要設定的屬性資訊,設定包裝型別。

private t createextension(string name) 

try

injectextension(instance);}}

return instance;

} catch (throwable t)

}

獲取啟用的擴充套件類

從url引數中獲取key對應的值並進行拆分,遍歷所有的啟用型別

public static final pattern comma_split_pattern = pattern.compile("\\s*[,]+\\s*");

public listgetactivateextension(url url, string key, string group)

public listgetactivateextension(url url, string values, string group) else if (activate instanceof com.alibaba.dubbo.common.extension.activate) else

if (ismatchgroup(group, activategroup)) }}

exts.sort(activatecomparator.comparator);

}listusrs = new arraylist<>();

for (int i = 0; i < names.size(); i++)

} else }}

if (!usrs.isempty())

return exts;

}

先判斷不在需要啟用的列表內values的型別,判斷組屬性是否匹配

private boolean ismatchgroup(string group, string groups) 

if (groups != null && groups.length > 0) }}

return false;

}

判斷是否啟用,url中是否有對應的key與啟用註解值相匹配,排序後返回,獲取需要啟用的對應型別,也就是入參的values,如果有預設型別的話就放到第乙個位置,合二為一後返回滿足啟用條件的類例項資訊。

private boolean isactive(string keys, url url) 

for (string key : keys) }}

return false;

}

Dubbo原始碼分析

dubbo原始碼分析 其實已經有很多比較好的原始碼分析部落格,結合部落格和開發經驗再去分析原始碼,就能對dubbo的實現有個整體全面的理解,也能深入去深究其中的具體實現細節。dubbo裡主要用到的spi service provider inte ce netty nio 同步非阻塞多路復用框架,d...

dubbo原始碼分析9 心跳機制

啟動心跳檢測 public headerexchangeserver server server this.server server this.heartbeat server.geturl getparameter constants.heartbeat key,0 心跳週期間隔時間 預設600...

Dubbo原始碼分析之SPI(二)

本篇文章是dubbo spi原始碼分析的第二篇,接著第一篇繼續分析dubbo spi的內容,我們主要介紹 getdefaultextension 獲取預設擴充套件點方法。由於此方法比較簡單,我們略過示例部分,直接分析原始碼。獲取預設擴充套件方法getdefaultextension 是乙個publi...