spring 依賴注入之 Resource注入

2022-09-23 05:21:09 字數 3556 閱讀 4352

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...