【@ConditionalOnMissingBean】進行判斷時對應的bean必定要實例化嗎?

一、根據源碼的追蹤結果看是不須要的,只要存在對應類型的bean定義就算符合。在經過方法【doGetBeanNamesForType】在【BeanFactory】中查找已存在的bean時,遍歷的是其bean定義集合【beanDefinitionNames】,而不是已經實例化的Bean集合【singletonObjects】,而且在經過方法【isTypeMatch】進行類型比對時,也是也是對bean定義名稱和目標類型進行的。對象

clip_image001[6]

二、當經過方法【isTypeMatch】進行比對時,若是當前Bean定義名稱存在實例對象,則直接用該實例進行比對。若是不存在實例對象,則會對該Bean定義進行類型推斷,若是推斷結果【predictedType】與由Bean定義自身屬性【targetType】和【factoryMethodReturnType】組合的【definedType】相同,則採用自身屬性的類型,而後進行最終的類型比對。blog

clip_image002[6]

clip_image003[6]

三、在這個比對過程當中能夠看到,【BeanFactory】中Bean定義和Bean實例其實具備相同的地位,在Bean實例未實例化出來時,能夠採用其Bean定義進行替代。Bean定義就是Bean實例的藍本,全部的Bean實例都是根據Bean定義來的,二者之間存在一一對應的關係。ip

四、在獲取匹配結果時,會先構建一個搜索Bean的指導說明【Spec】。get

clip_image004[6]

這個指導說明【Spec】的最重要做用,是肯定在【BeanFactory】中要到底查找到一個什麼樣的Bean,這個Bean的名字是什麼又或者類型是什麼。【@ConditionalOnMissingBean】的屬性【name】用來指定目標Bean的名字,屬性【value】和【type】用來指定目標Bean的類型,若是這三個屬性都不存在,則會經過推到方法【deducedBeanType】將@Bean方法的返回值類型做爲目標Bean的類型。源碼

clip_image005[6]

clip_image006[6]

也能夠將【@ConditionalOnMissingBean】的屬性【annotation】做爲Bean的篩選條件。it

clip_image007[6]

最後會對用於查找Bean的指導說明屬性進行檢查【validate】。若是既沒獲取篩選的類型,也沒指定Bean的名稱,還沒設置要篩選的Bean註解,則說明沒法進行匹配查詢,直接拋出錯誤。io

clip_image008[6]

在後續獲取匹配結果的過程當中,指導說明【Spec】的各項屬性都會依次參與比對過程。cli

clip_image009[6]

相關文章
相關標籤/搜索