BeanFactory與FactoryBean2

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 將指向同一個引用。
相關文章
相關標籤/搜索