當(dāng)我們需要獲取由spring管理的某個(gè)FactoryBean對(duì)象時(shí)可以在聲明的bean的id值之前添加&符號(hào)
* 作為FactoryBean對(duì)象的key進(jìn)行獲取
package beans;
import org.springframework.beans.factory.FactoryBean;
/**
* spring框架有這么一種規(guī)則
* 假如由Spring管理的對(duì)象是工廠對(duì)象時(shí)别惦,
* 系統(tǒng)底層通常會(huì)提供一個(gè)工廠對(duì)應(yīng)的bean對(duì)象
* 這個(gè)bean對(duì)象要實(shí)現(xiàn)Spring中的一個(gè)接口FactoryBean
*
*/
//實(shí)現(xiàn)接口要為泛型傳值拥诡,這里為T傳Object 定義接口的目的是定義規(guī)則
public class ObjectFactoryBean implements FactoryBean<Object> {
/**
* 通常在此方法中創(chuàng)建對(duì)應(yīng)的對(duì)象
* Spring底層在同個(gè)配置文件構(gòu)建Bean對(duì)象時(shí)筷厘,
* 首先會(huì)檢測(cè)你這bean對(duì)象是否實(shí)現(xiàn)了FactoryBean接口
* 假如實(shí)現(xiàn)了接口驼修,spring會(huì)調(diào)用這個(gè)Bean對(duì)象的getObject()方法
* 返回一個(gè)類的實(shí)例
* @return
* @throws Exception
*/
@Override
public Object getObject() throws Exception {
System.out.println("ObjectFactoryBean.getObject()");
return new ObjectFactory();//也可以通過反射
}
/**
* 1.對(duì)象單例并且容器關(guān)閉時(shí)執(zhí)行此方法
* 2.底層通過這個(gè)方法銷毀這個(gè)類型的對(duì)象
* 單例對(duì)象spring即負(fù)責(zé)創(chuàng)建又負(fù)責(zé)銷毀
* 多例對(duì)象spring只負(fù)責(zé)創(chuàng)建不負(fù)責(zé)銷毀
*/
@Override
public Class<?> getObjectType() {
System.out.println("ObjectFactoryBean.getObjectType()");
return ObjectFactory.class;
//假如對(duì)象是單例時(shí),底層系統(tǒng)會(huì)在容器關(guān)閉時(shí)命咐,依據(jù)此方法的返回類型篡九,查找對(duì)象,并銷毀對(duì)象
}
/**
* 通過此方法的返回值告訴底層系統(tǒng)此類的對(duì)象是否單例設(shè)計(jì)(此類的實(shí)例在內(nèi)存中只有一份)
* 此方法何時(shí)調(diào)用:對(duì)象創(chuàng)建時(shí)醋奠,單例對(duì)象銷毀時(shí)
*/
@Override
public boolean isSingleton() {
System.out.println("ObjectFactoryBean.isSingleton()");
return true;
}
}
package test;
import org.junit.Assert;
import org.junit.Test;
import beans.ObjectFactory;
import beans.ObjectFactoryBean;
public class TestBeans03 extends TestBase {
@Test
public void testObjectFactory(){
ObjectFactory of=ctx.getBean("objectFactory",ObjectFactory.class);
System.out.println(of.getClass().getName());
System.out.println("測(cè)試結(jié)束");
}
@Test
public void testObjectFactoryBean(){
/**
* 當(dāng)我們需要獲取由spring管理的某個(gè)FactoryBean對(duì)象時(shí)可以在聲明的bean的id值之前添加&符號(hào)
* 作為FactoryBean對(duì)象的key進(jìn)行獲取
*/
ObjectFactoryBean ofb = ctx.getBean("&objectFactory",ObjectFactoryBean.class);
System.out.println(ofb.getClass().getName());
Assert.assertNotEquals(null, ofb);
}
}
執(zhí)行testObjectFactory
ObjectFactoryBean.isSingleton()
ObjectFactoryBean.getObject()
beans.ObjectFactory
測(cè)試結(jié)束
ObjectFactoryBean.isSingleton()
ObjectFactoryBean.getObjectType()
執(zhí)行testObjectFactoryBean
beans.ObjectFactoryBean
ObjectFactoryBean.isSingleton()
ObjectFactoryBean.getObjectType()