1. 獲取bean 在上圖的測試類中我們是通過id來獲取bean的。實際上獲取bean的方式有很多種,下麵我們就一一說明。 1.1 方式一:根據id獲取 由於 id 屬性指定了 bean 的唯一標識,所以根據 bean 標簽的 id 屬性可以精確獲取到一個組件對象。 如開頭中我們使用的就是這種方式。 ...
1. 獲取bean
在上圖的測試類中我們是通過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唯一
例子:
這裡Student中實現了Person介面,但在配置文件中我們只配置了Student的bean
我們還是可以通過介面Person來獲取到Student的bean。
也就是說在IOC容器中配置了一個bean後,我們是可以通過它所繼承的父類或所實現的介面來獲取。
但前提是只有一個Student實現了Person介面
-
如果一個介面有多個實現類,這些實現類都配置了 bean,根據介面類型可以獲取 bean 嗎?
不行,因為bean不唯一。上面已經提到了
2. 總結
部分內容來自 B站尚矽谷課程 。老師講得很好,有興趣的可以聽聽。