歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Spring中Bean的命名問題(id和name區別)及ref和idref之間的區別

Spring中Bean的命名問題(id和name區別)及ref和idref之間的區別

日期:2017/3/1 9:35:14   编辑:Linux編程

Spring中Bean的命名

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

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

<bean class="com.zyh.spring3.hello.StaticBeanFactory"></bean>

此時需要通過接口getBean(Class<T> 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均為別名。如:

<bean name="alias1 alias2;alias3,alias4" id="hello1" class="com.zyh.spring3.hello.HelloWorld">
<constructor-arg index="0" value="Rod"></constructor-arg>
</bean>

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

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

<bean name="bean" class="com.zyh.spring3.hello.HelloWorld"/>
<alias alias="alias1" name="bean"/>
<alias alias="alias2" name="bean"/>

ref和idref之間的區別

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

考慮如下一段配置:

<bean id="bea" class="java.lang.String">
<constructor-arg index="0"><value>testString</value></constructor-arg>
</bean>
<bean id="beanID" class="com.zyh.spring3.hello.HelloWorld">
<constructor-arg name="name"><idref bean="bea" /></constructor-arg>
<property name="id">
<ref local="bea" />
</property>
<property name="age" value="25"></property>
</bean>

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

<constructor-arg name="name"><idref bean="bea" /></constructor-arg>

其實等同於

<constructor-arg name="name"><value>bea</value></constructor-arg>

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

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

Spring中如何配置Hibernate事務 http://www.linuxidc.com/Linux/2013-12/93681.htm

Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm

基於 Spring 設計並實現 RESTful Web Services http://www.linuxidc.com/Linux/2013-10/91974.htm

Spring-3.2.4 + Quartz-2.2.0集成實例 http://www.linuxidc.com/Linux/2013-10/91524.htm

使用 Spring 進行單元測試 http://www.linuxidc.com/Linux/2013-09/89913.htm

運用Spring注解實現Netty服務器端UDP應用程序 http://www.linuxidc.com/Linux/2013-09/89780.htm

Spring 3.x 企業應用開發實戰 PDF完整高清掃描版+源代碼 http://www.linuxidc.com/Linux/2013-10/91357.htm

Spring 的詳細介紹:請點這裡
Spring 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved