Spring中獲取bean的方式

1. 獲取bean

image-20220821170004102 image-20220821205138294

在上圖的測試類中我們是通過id來獲取bean的。實際上獲取bean的方式有很多種,下面我們就一一說明。

1.1 方式一:根據id獲取

由於 id 屬性指定了 bean 的唯一標識,所以根據 bean 標籤的 id 屬性可以精確獲取到一個組件對象。
如開頭中我們使用的就是這種方式。
bean標籤屬性:

  • id:設置bean的唯一標識
  • class:設置bean所對應類型的全類名
1.2 方式二:根據類型獲取

用的比較多

image-20220821210021960

注意:

  • 當根據類型獲取bean時,要求IOC容器中指定類型的bean有且只能有一個

    當IOC容器中一共配置了兩個:

    <bean id="helloworldOne" class="com.atguigu.spring.bean.HelloWorld"></bean>
    <bean id="helloworldTwo" class="com.atguigu.spring.bean.HelloWorld"></bean>
    

    會拋出異常:NoUniqueBeanDefinitionException

  • 若沒有任何一個類型匹配的bean,此時會拋出異常:NoSuchBeanDefinitionException

1.3 方式三:根據id和類型
image-20220821211219179

第三種方式是不是有點雞肋。。

或許是單純通過id獲取需要強制類型轉化吧,單純通過類型當匹配bean有多個時又不行,所以結合起來用。

1.4 擴展
  • 如果組件類實現了介面,根據介面類型可以獲取 bean 嗎?

    就是用了implements關鍵字

    可以的,前提是bean唯一

    例子:

    image-20220821213329811

    image-20220821213706235

    這裡Student中實現了Person介面,但在配置文件中我們只配置了Student的bean

    image-20220821214327573 image-20220821214348199

    我們還是可以通過介面Person來獲取到Student的bean。

    也就是說在IOC容器中配置了一個bean後,我們是可以通過它所繼承的父類或所實現的介面來獲取。

    但前提是只有一個Student實現了Person介面

  • 如果一個介面有多個實現類,這些實現類都配置了 bean,根據介面類型可以獲取 bean 嗎?

    不行,因為bean不唯一。上面已經提到了

2. 總結

部分內容來自 B站尚矽谷課程 。老師講得很好,有興趣的可以聽聽。