public propertyvalues postprocessproperties(propertyvalues pvs, object bean, string beanname)
catch (throwable ex)
return pvs;
}
private injectionmetadata findresourcemetadata(string beanname, final class<?> clazz, @nullable propertyvalues pvs)
// 真正的通過class檔案去掃瞄
metadata = buildresourcemetadata(clazz);
// 新增到快取中
this.injectionmetadatacache.put(cachekey, metadata);
}} }
// 返回得到的字段要注入的點,或者方法引數要注入的點
return metadata;
}/**
* 尋找注入點
*/private injectionmetadata buildresourcemetadata(final class<?> clazz)
// 定義最後找到的注入點
listelements = new arraylist<>();
// 定義掃瞄的類,掃瞄完當前類會把當前值變為他的父類
class<?> targetclass = clazz;
// 這個迴圈主要是為了去處理他的父類,直到沒有父類
do // 跳過@postconstruct和@predestroy這倆個標記的註解。
if (!this.ignoredresourcetypes.contains(field.gettype().getname()))
}});
// 方法注入點處理
reflectionutils.dowithlocalmethods(targetclass, method ->
// 得到所有的方法引數
class<?> paramtypes = method.getparametertypes();
// 方法引數不為1,拋異常
if (paramtypes.length != 1)
// 唯一的乙個引數不存在@postconstruct和@predestroy這倆個標記的註解。
if (!this.ignoredresourcetypes.contains(paramtypes[0].getname())) }}
});// 頭插法的方式去插入到總的(當前類以及他的全部父類)注入點中
elements.addall(0, currelements);
// 獲取他的父類
targetclass = targetclass.getsuperclass();
} while (targetclass != null && targetclass != object.class);
// 得到元素的全部注入點資訊
return injectionmetadata.forelements(elements, clazz);
}/**
* 構建注入點描述資訊
*/public resourceelement(member member, annotatedelement ae, @nullable propertydescriptor pd)
} // 使用@resource時指定了具體的name,進行佔位符填充
else if (embeddedvalueresolver != null)
// @resource除開可以指定bean,還可以指定type,type預設為object
if (object.class != resourcetype)
else
// null轉空串
this.name = (resourcename != null ? resourcename : "");
this.lookuptype = resourcetype;
// resource的lookup屬性處理
string lookupvalue = resource.lookup();
lazy lazy = ae.getannotation(lazy.class);
this.lazylookup = (lazy != null && lazy.value());
}
public void inject(object target, @nullable string beanname, @nullable propertyvalues pvs) throws throwable }}
/** * 對每個注入點進行注入
*/protected void inject(object target, @nullable string requestingbeanname, @nullable propertyvalues pvs)
throws throwable
// 方法的處理
else
try
catch (invocationtargetexception ex)
}}
protected object getresourcetoinject(object target, @nullable string requestingbeanname)
protected object getresource(lookupelement element, @nullable string requestingbeanname)
throws nosuchbeandefinitionexception
// 直接呼叫通過名稱呼叫getbean
if (this.alwaysusejndilookup)
// 直接呼叫通過名稱呼叫getbean
if (this.resourcefactory == null)
// 根據lookupelement從beanfactory找到適合的bean物件
return autowireresource(this.resourcefactory, element, requestingbeanname);
}/**
* 根據型別或者名稱去獲取要設定的bean
*/protected object autowireresource(beanfactory factory, lookupelement element, @nullable string requestingbeanname)
throws nosuchbeandefinitionexception
} else
} else
// 處理bean的依賴關係嗎,當前bean被那些bean依賴,依賴了那些bean
if (factory instanceof configurablebeanfactory)
} }return resource;
}
spring 依賴注入 Spring依賴注入
依賴注入 dependency injection,簡稱di 與控制反轉 ioc 的含義相同控制反 在使用spring框架之後,物件的例項不再由呼叫者來建立,而是由spring容器來建立,spring容器會負責控制程式之間的關係,而不是由呼叫者的程式 直接控制,這樣控制權由應用程式轉移到了sprin...
spring 之 ioc 依賴注入
關於bean的名稱,這裡有條預設的規則,就是類的名稱,然後第乙個字母小寫 依賴注入 xml方式 通過setter方法注入依賴 元素的 property 子元素指明了使用它們的set方法來注入。可以注入任何東西,從基本型別到集合類,甚至是應用系統的bean。這種方式的缺點是你無法在其它地方重用這個pe...
spring學習之 依賴注入
spring框架的核心功能有兩個 1.理解依賴注入 控制反轉 ioc 呼叫者無須主動獲取被依賴物件,呼叫者只要被動接受spring容器為呼叫者的成員變數賦值即可。依賴注入 di spring容器負責將被依賴物件賦值給呼叫者的成員變數,相當於注入它依賴的例項。兩大改變 2.設值注入 設值注入是指ioc...