獲取到自適應型別後進行例項化並且進行屬性注入,這裡會判斷物件工廠是否為空,當型別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...