1. 程式人生 > >spring中的Bean的id和name的區別

spring中的Bean的id和name的區別

spring中的Bean的id和name的區別

2017年10月01日 18:23:59 冰河家園 閱讀數:296 標籤: spring 更多

個人分類: spring

Spring中Bean的命名

1、每個Bean可以有一個id屬性,並可以根據該id在IoC容器中查詢該Bean,該id屬性值必須在IoC容器中唯一;

2、可以不指定id屬性,只指定全限定類名,如:

 

此時需要通過介面getBean(Class requiredType)來獲取Bean;

如果該Bean找不到則拋異常:NoSuchBeanDefinitionException

如果該型別的Bean有多個則拋異常:NoUniqueBeanDefinitionException

3、如果不指定id,只指定name,那麼name為Bean的識別符號,並且需要在容器中唯一;

4、同時指定name和id,此時id為識別符號,而name為Bean的別名,兩者都可以找到目標Bean;

5、可以指定多個name,之間可以用分號(“;”)、空格(“ ”)或逗號(“,”)分隔開,如果沒有指定id,那麼第一個name為識別符號,其餘的為別名;若指定了id屬性,則id為識別符號,所有的name均為別名。如:

 

此時,hello1為識別符號,而alias1,alias2,alias3,alias4為別名,它們都可以作為Bean的鍵值;

6、可以使用標籤指定別名,別名也必須在IoC容器中唯一,如:

 

ref和idref之間的區別

在Spring中,idref屬性和ref屬性都可以用在constructor-arg元素和property元素中完成注入,那麼它之間有什麼區別呢?

考慮如下一段配置:

testString

其實,idref注入的是目標bean的id而不是目標bean的例項,同時使用idref容器在部署的時候還會驗證這個名稱的bean是否真實存在。其實idref就跟value一樣,只是將某個字串注入到屬性或者建構函式中,只不過注入的是某個Bean定義的id屬性值。所以上面的程式碼中

 

其實等同於

bea

而ref則是完全地不同,ref元素是將目標Bean定義的例項注入到屬性或建構函式中,ref元素有三個屬性,區別如下:

1、local 只能指定與當前配置的Bean在同一個配置檔案中的Bean定義的名稱; 2、parent 只能指定位於當前容器的父容器中定義的物件引用; 3、bean 基本上通吃,即包括以上兩種情況都可以,所以,通吃情況下,直接使用bean來指定物件引用就可以了。 所以,上面那段配置程式碼中,beanID這個Bean中建構函式的引數name注入的只是“bea”這個字串;而其id屬性注入的則是testString這個字串。