這篇文章來談?wù)?a >《Spring Framework 開發(fā)參考手冊》的3.3.2小節(jié)中的ref的用法。
ref元素是用在property中,來設(shè)置需要引用的容器管理的其它Bean。
它的用法:<ref bean|local|parent="someBean">,這里主要分析一下這三個參數(shù)的作用。
這次先看實(shí)例,再進(jìn)行講解。
· 先建立一個包:javamxj.spring.basic.ref ,然后把以下5個文件放在這個包下。
HelloBean.java |
package javamxj.spring.basic.ref;
public class HelloBean { private String hello;
public String getHello() { return hello; }
public void setHello(String hello) { this.hello = hello; } } |
HelloDate.java |
package javamxj.spring.basic.ref;
import java.util.Date;
public class HelloDate { private Date date;
private HelloBean hb;
public void setDate(Date date) { this.date = date; }
public void setHb(HelloBean hb) { this.hb = hb; }
public void sayHello() { System.out.println(hb.getHello() + " " + date.toLocaleString()); }
} |
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloBean" class="javamxj.spring.basic.ref.HelloBean">
<property name="hello" value="Hello! Child Bean." />
</bean>
<bean id="dateBean" name="#date" class="java.util.Date"/>
<bean id="hd1" class="javamxj.spring.basic.ref.HelloDate">
<property name="hb">
<ref bean="helloBeanParent"/>
</property>
<property name="date">
<ref bean="#date"/>
<!--<ref bean="dateBean"/>-->
</property>
</bean>
<bean id="hd2" class="javamxj.spring.basic.ref.HelloDate">
<property name="hb">
<ref local="helloBean"/>
</property>
<property name="date">
<ref local="dateBean"/>
</property>
</bean>
<bean id="hd3" class="javamxj.spring.basic.ref.HelloDate">
<property name="hb">
<ref parent="helloBean"/>
</property>
<property name="date">
<bean class="java.util.Date"/>
</property>
</bean>
</beans>
parent.xml |
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloBean" class="javamxj.spring.basic.ref.HelloBean"> <property name="hello" value="Hello! Javamxj." /> </bean> <bean id="helloBeanParent" class="javamxj.spring.basic.ref.HelloBean"> <property name="hello" value="Hello! Parent Bean." /> </bean> </beans> |
Main.java |
package javamxj.spring.basic.ref;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource;
public class Main {
public static void main(String[] args) { BeanFactory parent = new XmlBeanFactory(new ClassPathResource( "javamxj/spring/basic/ref/parent.xml")); BeanFactory child = new XmlBeanFactory(new ClassPathResource( "javamxj/spring/basic/ref/beans.xml"), parent);
HelloDate hd1 = (HelloDate) child.getBean("hd1"); HelloDate hd2 = (HelloDate) child.getBean("hd2"); HelloDate hd3 = (HelloDate) child.getBean("hd3");
hd1.sayHello(); hd2.sayHello(); hd3.sayHello(); } } |
·運(yùn)行Main.java,輸出結(jié)果如下:
Hello! Parent Bean. 2005-8-10 22:25:56
Hello! Child Bean. 2005-8-10 22:25:56
Hello! Javamxj. 2005-8-10 22:25:56
OK!這里主要分析beans.xml、Main.java這兩個文件。對于Main.java要注意的是如何加載“parent”的,重點(diǎn)看看beans.xml中ref元素的用法。
首先定義兩個bean:helloBean、dateBean,分別指向HelloBean類和Date類。然后定義了hd1、hd2、hd3等三個bean,都指向HelloDate類。
·hd1:
property標(biāo)簽中的“helloBeanParent”并不存在于beans.xml中,而是在parent.xml中,使用<ref bean="someBean">可以從其它bean配置文件中尋找需要加載的目標(biāo)bean。bean屬性的值可以同目標(biāo)bean的id屬性相同,也可以同它的name屬性中任意的一個值相同。
·hd2:
property標(biāo)簽中的“helloBean”如果不存在于beans.xml中,則XML解析器會提示錯誤。<ref local="someBean">只能這個bean配置文件中尋找需要加載的目標(biāo)bean,而且local屬性值必須同目標(biāo)bean的id屬性相同。
·hd3:
property標(biāo)簽中的“helloBean”同時存在于beans.xml和parent.xml中,使用<ref bean="someBean">則會優(yōu)先從beans.xml中尋找需要加載的目標(biāo)bean,如果需要從parent.xml中加載目標(biāo)bean,則需使用<ref parent="someBean">。在設(shè)置date時,使用的是內(nèi)聯(lián)bean,這時可以不要任何id或name定義。
好了,就說這么多了。