Spring中的@Resource源碼解析
@Resource 源碼
這個(gè)注解加載的時(shí)候經(jīng)過(guò)的類是CommonAnnotationBeanPostProcessor 和Autowired一樣,也是postProcessProperties()方法。
而且 InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs); 這一行的內(nèi)部流程和AutowiredAnnotationBeanPostProcessor是一樣的所以看一下就可以,不在這里一一解析了。
不一樣的點(diǎn)在于inject()方法的調(diào)用,這個(gè)inject()方法調(diào)用的是父類里面的,并沒(méi)有像Autowired里面一樣調(diào)用子類Element的inject()方法。
主要代碼就在紅框中
getResourceToInject()方法來(lái)獲取需要注入的對(duì)象I 按我們之前的例子中來(lái)說(shuō),需要往F類中注入I對(duì)象,那么target就是F,requestingBeanName就是I
Resource重寫了Element的方法,所以進(jìn)入了ResourceElement這個(gè)類中 if條件中的代碼先不用看,這里這里暫時(shí)不會(huì)執(zhí)行。
getResource()方法中代碼有很多條件,最終執(zhí)行的代碼就是autowireResource()方法
首先是第一個(gè)if(factory instanceof AutowireCapableBeanFactory) 這里正常情況下都是會(huì)成立的: 可以通過(guò)AnnotationConfigApplicationContext()這個(gè)類看到, AnnotationConfigApplicationContext-extends->GenericApplicationContext GenericApplicationContext類中的屬性DefaultListableBeanFactory-extends->AbstractAutowireCapableBeanFactory-extends->AbstractBeanFactory 關(guān)系有點(diǎn)不調(diào)好理,大概看一下知道這個(gè)if一定會(huì)成立就可以了。
那么Resource和Autowired主要的區(qū)別就在這一行。 第一個(gè)判斷是寫死的true不用管;
而第二個(gè)屬性isDefaultName,在默認(rèn)情況下是false,但是!在初始化的時(shí)候會(huì)判斷@Resource注解后面有沒(méi)有(name="")這個(gè)屬性,如果有值的話,是false,如果沒(méi)有值的話是true
再來(lái)看第三個(gè)判斷,factory.containsBean(name) 這個(gè)方法就是,通過(guò)name去spring容器Map中查詢,能不能找到這個(gè)單例bean; 或者在beanDefinition中能不能找到這個(gè)bean。 這兩個(gè)區(qū)別在哪呢,前一個(gè)是已經(jīng)實(shí)例化好的Bean,而后一個(gè)可以理解為存儲(chǔ)Bean所有掃描到的對(duì)象。這個(gè)也是需要展開來(lái)講的。 這里只需要知道,是去spring容器中通過(guò)name去查詢bean就可以了。
而為什么要進(jìn)行這個(gè)判斷,這就是Resource和Autowired的主要區(qū)別,這里先通過(guò)name來(lái)獲取Bean,如果按照我們之前的例子的話,就是直接通過(guò)”a“去獲取Bean。
@Resource I a;
我們?cè)倩貋?lái)看這個(gè)代碼,也就是說(shuō),進(jìn)入了這個(gè)if判斷的話,那就與Autowired沒(méi)有區(qū)別了,而else中的邏輯才是通過(guò)name去查找Bean。 這就是Resource的注入邏輯
到此這篇關(guān)于Spring中的@Resource源碼解析的文章就介紹到這了,更多相關(guān)@Resource源碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)之反射技術(shù)相關(guān)知識(shí)總結(jié)
今天帶大家復(fù)習(xí)Java基礎(chǔ)知識(shí),文中對(duì)Java反射技術(shù)介紹的非常詳細(xì),對(duì)正在學(xué)習(xí)Java的小伙伴們很有幫助,,需要的朋友可以參考下2021-05-05Mybatis實(shí)現(xiàn)查詢相冊(cè)數(shù)據(jù)列表流程講解
這篇文章主要介紹了Mybatis實(shí)現(xiàn)查詢相冊(cè)數(shù)據(jù)列表流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(60)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08android顯示意圖激活另一個(gè)Activity的方法
下面小編就為大家?guī)?lái)一篇android顯示意圖激活另一個(gè)Activity的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06jvm內(nèi)存溢出解決方法(jvm內(nèi)存溢出怎么解決)
jvm內(nèi)存溢出解決方法,詳細(xì)內(nèi)容看下面解釋2013-12-12Spring Boot2配置服務(wù)器訪問(wèn)日志過(guò)程解析
這篇文章主要介紹了Spring Boot2配置服務(wù)器訪問(wèn)日志過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11詳解在springboot中使用Mybatis Generator的兩種方式
這篇文章主要介紹了詳解在springboot中使用Mybatis Generator的兩種方式,本文將介紹到在springboot的項(xiàng)目中如何去配置和使用MBG以及MBG生成代碼的兩種方式,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11