Spring中對LookUp註解的處理

2021-01-11 簡單說架構

Spring中,可通過方法參數或實例屬性來進行注入。Spring中對LookUp註解的處理。

Springpeyt

開始

上一次,我們聊到了AutowiredFieldElement中的inject方法,聊到了獲取value。那麼,這次,我們就聊聊它是怎麼獲取value的。

InjectionPoint

沿著inject的邏輯,我們找到了resolvedCachedArgument方法,然後,我們看到了一個新的類,DependencyDescriptor。這是幹什麼的呢?溯源而上。

InjectionPoint,直譯為注入點。這個類也確實是用來描述一個注入點的,即解決從什麼位置注入的問題。注入點通常有以下兩種形式:

1. 一個實例方法的參數,該實例方法可以是構造方法,也可以是其它方法,注入點中,會保存該參數及其上的相關註解等信息。

2. 實例成員屬性,注入點會保存該成員及其上的相關註解等信息。

也就是說,注入點由注入位置和輔助信息構成。注入位置通常是某方法的參數或某成員屬性,輔助信息則由註解負責描述。我們也看到,InjectionPoint中,幾個成員變量,分別是MethodParameter類型,Field類型和Annotion數組。

DependencyDescriptor

DependencyDescriptor,依賴描述符,該類繼承於InjectionPoint,在注入點相關信息的基礎上,增加了依賴相關的其它一些必要信息,如依賴是否必要,是否飢餓加載,嵌套級別等。

這裡,沒什麼要詳細說的,具體方法等用到再說,補充一些關於飢餓加載的知識。

加載就是把需要用到的目標載入進來,在Spring中,指的是獲取依賴的Bean,並注入。那什麼時候注入呢?就引出了關於加載方式的幾個名詞,除飢餓加載外,還有延遲加載和顯示加載。

飢餓加載,加載某Bean的同時,會將該Bean中所依賴的Bean同時加載進來。很符合飢餓這個名詞,我已經餓了,所以,有吃的趕緊上,哪怕我暫時還沒空吃呢。

延遲加載,又叫懶加載,我飢餓加載剛好不同,加載Bean的同時,並不會同時加載它的依賴,只有在相關依賴需要用到時,才會加載。

顯示加載,事實上,顯示加載不能稱之為一種加載方式,它只是通過相關代碼,顯示的告訴程序要何時加載,要飢餓加載還是延遲加載。

留個思考題:飢餓加載和延遲加載的意義分別在哪裡?

resolvedCachedArgument

resolvedCachedArgument,直譯為解決緩存參數。回到AutowiredFieldElement的inject方法,發現,當cached為true時,就會走該方法。參數是一個bean名稱和cachedFieldValue。在resolvedCachedArgument方法中,我們發現,cachedFieldValue可以轉換成一個依賴描述符類,轉換後,通過調用BeanFactory的resolveDependency方法,來獲取相應的依賴。

當cached為false時,會自己通過field和required參數來構造依賴描述符,構建完成後,再調用resolvedCachedArgument獲取依賴。獲取成功好,會根據相關結果和配置,調用registerDependentBeans,該方法最終調用了BeanFactory的registerDependentBean方法,主要是把依賴的Bean註冊到Bean工廠中。

ShortcutDependencyDescriptor

ShortcutDependencyDescriptor,快捷依賴描述符。當cached為false時,還用到了AutowiredAnnotationBeanPostProcessor中的另一個內部類,ShortcutDependencyDescriptor。這個類的作用是通過一個shortcut,以幫助從Bean工廠中,更快找到需要的依賴。

AutowiredAnnotationBeanPostProcessor中,還有另外一個內部類,AutowiredMethodElement,它和AutowriedFieldElement的意義和用法基本是相同的。只是一個用於欄位,另一個用於方法。

至此,我們聊完了AutowiredAnnotationBeanPostProcessor的postProcessProperties方法,再往下,我們發現postProcessPropertyValues打上了過期標誌,而predictBeanType沒什麼內容,所以,我們直接來到了determineCandidateConstructors方法。

determineCandidateConstructors

determineCandidateConstructors,直譯為確定候選人的構造函數。這個方法比較長,但是我們發現,它其實可以分成兩個部分,其中,第一部分是對LookUp註解的處理。之前我們聊過,LookUp註解可以幫助我們避免在單例模式Bean中依賴原型Bean時,出現的原型變成單例的問題,那麼,這部分的邏輯就是遍歷Bean中,每個依賴上的LookUp註解,並根據LookUp的value,形成一個LookUpOverride,並把該Override,添加到Bean定義的MethodOverrides集合中。

這裡,補充一下LookUpOverride是啥。LookUpOverride繼承於MethodOverride,MethodOverride又實現了BeanMetadataElement接口。BeanMetadataElement直譯為Bean元數據元素,只有一個getSource方法,用於返回Bean的來源。

MethodOverride,直譯為方法重寫,是一個抽象類,主要定義了方法名稱這個類屬性。

LookupOverride,直譯為LookUp重寫。主要是為了記錄某個被LookUp註解標記的注入。

第二部分,正式獲取候選構造方法列表,這部分內容,我們下次再聊。

相關

Spring Bean相關的常用註解(1)

Spring Bean相關的常用註解(2)

Spring Bean相關的常用註解(3)

Spring中的注入是通過反射來完成的

Spring中BeanDefinition的繼承體系

相關焦點

  • spring框架之註解的使用
    1開啟註解①開啟spring的註解context:annotation-config讓註解有效了,能夠識別註解。如果是註解+XML組合使用,可以只開啟①。2註解的使用①@Component註解相當於將對象存放到spring容器中。
  • Spring boot 基於註解方式配置datasource
    的配置文件中,加載資料庫配置文件<!註解配置先要知道幾個註解:@Configuration:此註解看用理解為spring的一個xml文件@PropertySource:對應原xml中設置配置文件的@MapperScan
  • Spring常用註解類
    Java5.0過後開始支持註解,Spring作為java中的領軍框架,在Spring2.5過後也開始放棄xml配置文件了,更多的推薦註解來使用Spring框架。Spring中那麼多的註解,其中很多可能在工作中很少能遇見,也就用不上。下面就給大家總結一些常用的註解。
  • Spring註解配置和xml配置優缺點比較
    Spring註解配置和xml配置優缺點比較在昨天發布的文章《spring boot基於註解方式配置datasource》一文中凱哥簡單的對xml配置和註解配置進行了比較。然後朋友看到文章後,就問:那你說說這兩種區別。額,說真的,還真把凱哥給問蒙圈了。
  • SpringMVC的常用註解
    ,要好好的理解,在實際開發中,很常用的註解之一。we'b第三個:@PathVaribale註解作用:該註解是用於綁定url中的佔位符,但是注意,spring3.0以後,url才開始支持佔位符的Controller註解作用:該註解是用來標記一個類的,如果被一個類被標註為Controller的話,那麼它就會被spring掃面機制掃面到,然後會自動將其註冊為spring應用程式的上下文裡的一個
  • 乾貨|SpringBoot註解大全,值得收藏
    項目中由控制器負責將用戶發來的URL請求轉發到對應的服務接口(service層),一般這個註解在類中,通常方法需要配合註解@RequestMapping。@Bean:相當於XML中的,放在方法的上面,而不是類,意思是產生一個bean,並交給spring管理。@AutoWired:自動導入依賴的bean。byType方式。
  • spring面試題目!
    什麼是spring?Spring框架的設計目標,設計理念,和核心是什麼Spring的優缺點是什麼?Spring有哪些應用場景Spring由哪些模塊組成?Spring 框架中都用到了哪些設計模式?詳細講解一下核心容器(spring context應用上下文) 模塊Spring框架中有哪些不同類型的事件Spring 應用程式有哪些不同組件?使用 Spring 有哪些方式?
  • 面試官經常喜歡問的一些關於spring的面試題
    面向切面編程(AOP),在面向對象編程(oop)思想中,我們將事物縱向抽成一個個的對象。而在面向切面編程中,我們將一個個的對象某些類似的方面橫向抽成一個切面,對這個切面進行一些如權限控制、事物管理,記錄日誌等公用操作處理的過程就是面向切面編程的思想。
  • excel中的經典查找引用函數之lookup函數的使用
    excel表格的眾多函數中,我們常用的查找引用函數大致有3個,分別是有縱向查找功能的vlookup函數、有橫向查找功能的hlookup函數和可以任意多條件查找引用的lookup函數。下面我們來介紹lookup函數的用法。
  • 詳解SpringCloud中RabbitMQ消息隊列原理及配置,一篇就夠!
    rabbitmq已經被spring-boot做了整合訪問實現。spring cloud也對springboot做了整合邏輯。所以rabbitmq的依賴可以在spring cloud中直接使用。 * 註解方法,代表當前方法是一個rabbit listener處理邏輯。 * 方便開發,一個類中可以定義若干個listener邏輯。 * 方法定義規範可能不合理。如:一個方法的處理邏輯太多,造成方法的bad smell。
  • Spring學習筆記,菜鳥程序猿必看,一篇文章讓你摸透Spring
    spring 創建類後,將其存入到 request 範圍中session: 在web項目中,spring 創建類後,將其存入到 session 範圍中globalsession: 在web項目中,必須用在 porlet 環境
  • 比vlookup函數還更好用的lookup函數講解
    我們在實際工作中,當我們需要處理數據的時候,我們首先會想到使用excel表格,因為excel中有很多可以顯著提高我們工作效率的函數,我們可以藉助這些函數對數據進行快速處理,可以減輕我們的工作負擔。比vlookup函數還更好用的lookup函數講我們上節課講解了有關vlookup函數的相關內容,我們知道了vlookup函數是一個比較好用的查找函數,今天我們分享一個更加好用的查找函數
  • Spring Boot面試題(2020最新版)
    Spring Boot 的核心註解是哪個?它主要由哪幾個註解組成的?Spring Boot 推薦使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通過 @ImportResource 註解可以引入一個 XML 配置。spring boot 核心配置文件是什麼?
  • 重學Java 設計模式:實戰代理模式「模擬mybatis-spring中定義DAO...
    五、代理類模式實現過程接下來會使用代理類模式來模擬實現一個Mybatis中對類的代理過程,也就是只需要定義接口,就可以關聯到方法註解中的sql語句完成對資料庫的操作。GenericBeanDefinition,定義bean的信息,在mybatis-spring中使用到的是;ScannedGenericBeanDefinition 略有不同。FactoryBean,用於處理bean工廠的類,這個類非常見。1.
  • springMVC框架之幾個常用註解的使用
    ②問題二看到new關鍵字,就可以使用spring優化,具體在文章第三節中有詳細說明。一個處理器類只能處理一個請求,並且這個類還要在配置文件中配置。這個問題我們以前學servlet的時候就遇到過,當時我們是創建一個BaseServlet,再使用反射,讓其子類一個方法對應一個請求。這裡的解決方式是使用註解。
  • 這可能是對 Spring 事務原理講解最透徹的文章了
    要回答這個問題就必須中整體上去了解Spring的事務管理實現原理了。下面我以註解方式來向大家做介紹:首先再配置文件中開啟事務的註解驅動,在需要使用到事務的類和方法上使用@Transactional標識。
  • 小學妹問:Mybatis常見註解有哪些?
    當下,註解非常流行,以前很長篇的代碼,現在基本上一個註解就能搞定。那,在Mybatis中又有哪些註解呢?該註解是由Mybatis框架中定義的一個描述數據層接口的註解,註解往往起到的都是一個描述性作用,用於告訴Spring框架此接口的實現類由Mybatis負責創建,並將其實現類對象存儲到spring容器中。
  • Spring IOC的核心機制:實例化與注入
    spring是如何將對象加入容器的spring將對象加入容器的方式有很多種,最主要的是xml和註解的形式,而當下注解的形式應用更加的廣泛,所以這裡我們也主要介紹註解注入模式下的相關知識點。spring下的註解也是有很多種的,其中應用最為廣泛的就是模式註解。
  • 你知道Spring是怎麼解析配置類的嗎?
    ,看內部類中是否有配置類,如果有進行遞歸處理處理配置類上的@PropertySources跟@PropertySource註解處理@ComponentScan,@ComponentScans註解處理@Import註解
  • 繼「劉強東」之後京東的第二位程式設計師「呂科」spring面試題講解
    Spring提供了- -個便捷的事務管理接口,適用於小型的本地事物處理(比如在單DB的環境下)和複雜的共同事物處理(比如利用JTA的複雜DB環境)。3、什麼是控制反轉(IOC)?什麼是依賴注入?Appl icat ionContex接口對BeanFactory (是- -個子接口)進行了擴展,在BeanFactory的基礎.上添加了其他功能,比如與Spring的AOP更容易集成,也提供了處理message resource的機制(用於國際化)、事件傳播以及應用層的特別配置,比如針對Web應用的WebApplicationContext.org. springframework