天天看點

Spring中擷取bean的方式

1. 擷取bean

Spring中擷取bean的方式
Spring中擷取bean的方式

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

1.1 方式一:根據id擷取

由于 id 屬性指定了 bean 的唯一辨別,是以根據 bean 标簽的 id 屬性可以精确擷取到一個元件對象。

如開頭中我們使用的就是這種方式。

bean标簽屬性:

  • id:設定bean的唯一辨別
  • class:設定bean所對應類型的全類名
1.2 方式二:根據類型擷取

用的比較多

Spring中擷取bean的方式

注意:

  • 當根據類型擷取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和類型
Spring中擷取bean的方式

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

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

1.4 擴充
  • 如果元件類實作了接口,根據接口類型可以擷取 bean 嗎?

    就是用了​​

    ​implements​

    ​關鍵字
可以的,前提是bean唯一
  • 例子:
  • Spring中擷取bean的方式
  • Spring中擷取bean的方式
  • 這裡Student中實作了Person接口,但在配置檔案中我們隻配置了Student的bean
  • 我們還是可以通過接口Person來擷取到Student的bean。

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

    但前提是隻有一個Student實作了Person接口

  • 如果一個接口有多個實作類,這些實作類都配置了 bean,根據接口類型可以擷取 bean 嗎?