BeanFactory爲一個管理bean的工廠(即爲spring的容器),它管理的對象可以是bean也可以是FactoryBean(這種請況會再調用FactoryBean的getObject()獲取真正的bean)。
FactoryBean爲一個工廠bean,受BeanFactory管理,同時它也管理着一個bean。
接着來看一看FactoryBean:
public interface FactoryBean {
Object getObject() throws Exception;
Class getObjectType();
boolean isSingleton();
} |
FactoryBean是spring的一個工廠bean,他可以管理一個bean,通過isSingleton方法設置此bean是否爲單例,通過getObject方法獲取此bean實例的引用,getObjectType
方法獲取此bean的類型。記住一點:FactoryBean在配置文件中的定義和普通bean沒有區別,但是當客戶端對beanId進行請求時,返回的是它管理的bean實例引用(即此FactoryBean通過getObject獲取了它所管理的bean實例引用)。
下面舉一個例子來說明:
Fengshan1.java(此類爲被FactoryBean管理的類):
public class FengShan1 {
public void descrip(){
System.out.println("鳳山是個美麗的小縣城!");
}
} |
TianE.java(此類爲繼承FactoryBean接口的類):
public class TianE implements FactoryBean {
public Object getObject() throws Exception {
return new FengShan1();
}
public Class getObjectType() {
return FengShan1.class;
}
public boolean isSingleton() {
return true;
}
} |
Beam.xml(spring配置文件):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans default-autowire="byName" >
<!—FactoryBean配置-->
<bean id="tiane" class="com.dvnchina.test.TianE" />
</beans> |
Test.java(測試類):
public class Test extends TestCase {
public void test(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
FengShan1 fengShan1 = (FengShan1) ctx.getBean("tiane");
fengShan1.descrip();
FengShan1 fengShan2 = (FengShan1) ctx.getBean("tiane");
System.out.println(fengShan1==fengShan2);
}
} |
結果:
鳳山是個美麗的小縣城!
true |
在測試類中,ctx.getBean("tiane")獲取的是FactoryBean的BeanId,但返回的是它所管理的Bean實例(FengShan1)。另外,因爲在FactoryBean中isSingleton方法返回值爲true,因此fengShan1和fengShan2將指向同一個引用。