1. 擷取bean
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyYTO5kzYxMmYjV2NzIDMzYzXyMTO0EjMxIzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
在上圖的測試類中我們是通過id來擷取bean的。實際上擷取bean的方式有很多種,下面我們就一一說明。
1.1 方式一:根據id擷取
由于 id 屬性指定了 bean 的唯一辨別,是以根據 bean 标簽的 id 屬性可以精确擷取到一個元件對象。
如開頭中我們使用的就是這種方式。
bean标簽屬性:
- id:設定bean的唯一辨別
- class:設定bean所對應類型的全類名
1.2 方式二:根據類型擷取
用的比較多
注意:
-
當根據類型擷取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和類型
第三種方式是不是有點雞肋。。
或許是單純通過id擷取需要強制類型轉化吧,單純通過類型當比對bean有多個時又不行,是以結合起來用。
1.4 擴充
-
如果元件類實作了接口,根據接口類型可以擷取 bean 嗎?
就是用了
關鍵字implements
可以的,前提是bean唯一
- 例子:
-
Spring中擷取bean的方式 -
Spring中擷取bean的方式 - 這裡Student中實作了Person接口,但在配置檔案中我們隻配置了Student的bean
-
我們還是可以通過接口Person來擷取到Student的bean。
也就是說在IOC容器中配置了一個bean後,我們是可以通過它所繼承的父類或所實作的接口來擷取。
但前提是隻有一個Student實作了Person接口
- 如果一個接口有多個實作類,這些實作類都配置了 bean,根據接口類型可以擷取 bean 嗎?