1、根據源碼的追蹤結果看是不需要的,只要存在對應類型的bean定義就算符合。在通過方法【doGetBeanNamesForType】在【BeanFactory】中查找已存在的bean時,遍歷的是其bean定義集合【beanDefinitionNames】,而不是已經實例化的Bean集合【singletonObjects】,並且在通過方法【isTypeMatch】進行類型比對時,也是也是對bean定義名稱和目標類型進行的。
2、當通過方法【isTypeMatch】進行比對時,如果當前Bean定義名稱存在實例對象,則直接用該實例進行比對。如果不存在實例對象,則會對該Bean定義進行類型推斷,如果推斷結果【predictedType】與由Bean定義自身屬性【targetType】和【factoryMethodReturnType】組合的【definedType】相同,則采用自身屬性的類型,然后進行最終的類型比對。
3、在這個比對過程中可以看到,【BeanFactory】中Bean定義和Bean實例其實具有相同的地位,在Bean實例未實例化出來時,可以采用其Bean定義進行替代。Bean定義就是Bean實例的藍本,所有的Bean實例都是根據Bean定義來的,兩者之間存在一一對應的關系。
4、在獲取匹配結果時,會先構建一個搜索Bean的指導說明【Spec】。
這個指導說明【Spec】的最重要作用,是確定在【BeanFactory】中要到底查找到一個什么樣的Bean,這個Bean的名字是什么又或者類型是什么。【@ConditionalOnMissingBean】的屬性【name】用來指定目標Bean的名字,屬性【value】和【type】用來指定目標Bean的類型,如果這三個屬性都不存在,則會通過推到方法【deducedBeanType】將@Bean方法的返回值類型作為目標Bean的類型。
也可以將【@ConditionalOnMissingBean】的屬性【annotation】作為Bean的篩選條件。
最后會對用於查找Bean的指導說明屬性進行檢查【validate】。如果既沒獲取篩選的類型,也沒指定Bean的名稱,還沒設置要篩選的Bean注解,則說明無法進行匹配查詢,直接拋出錯誤。
在后續獲取匹配結果的過程中,指導說明【Spec】的各項屬性都會依次參與比對過程。