BeanFactory與FactoryBean2

BeanFactory爲一個管理bean的工廠(即爲spring的容器),它管理的對象可以是bean也可以是FactoryBean(這種請況會再調用FactoryBeangetObject()獲取真正的bean)

FactoryBean爲一個工廠bean,受BeanFactory管理,同時它也管理着一個bean

 

接着來看一看FactoryBean

public interface FactoryBean {

    Object getObject() throws Exception;

    Class getObjectType();

    boolean isSingleton();

}

FactoryBeanspring的一個工廠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")獲取的是FactoryBeanBeanId,但返回的是它所管理的Bean實例(FengShan1)。另外,因爲在FactoryBeanisSingleton方法返回值爲true,因此fengShan1fengShan2將指向同一個引用。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章