一分鐘瞭解spring之FactoryBean
阿新 • • 發佈:2018-11-03
轉自 http://blog.51cto.com/4247649/2118353
今天主要從以下兩方面來介紹一下FactoryBean
- FactoryBean是什麼
- FactoryBean使用演示
1,FactoryBean是什麼
- FactoryBean從名字來看以bean結尾那應該就是一個bean吧,沒錯它確實是一個bean,不同於普通Bean的是:它是實現了FactoryBean介面的Bean,根據該Bean的ID從BeanFactory中獲取的實際上是FactoryBean的getObject()返回的物件,而不是FactoryBean本身,如果要獲取FactoryBean物件,請在id前面加一個&符號來獲取
2,FactoryBean使用演示
首先咱們一起來看下FactoryBean的原始碼如下:
public interface FactoryBean<T> { /** * 獲取bean對應的例項物件 * @return * @throws Exception */ T getObject() throws Exception; /** * 獲取factoryBean獲取到的例項型別 * @return */ Class<?> getObjectType(); /** * factoryBean建立的例項是否是單例項 * @return */ boolean isSingleton(); }
可以發現FactoryBean是一個介面主要有3個方法,每個方法的意思程式碼中都有註釋這個就不重複了
下面我們通過FactoryBean來建立一個圖形Circular的bean,程式碼如下:
/** * 建立一個自定義的spring的FactoryBean * * @author zhangqh * @date 2018年5月2日 */ public class MyFactoryBean implements FactoryBean<Circular>{ public Circular getObject() throws Exception { return new Circular(); } public Class<?> getObjectType() { return Circular.class; } /** * 是否是單例項的,可以通過改變返回值測試效果 */ public boolean isSingleton() { return true; } }
再在MainConfig主配置中增加一個bean如下:
@Bean
public MyFactoryBean getMyFactoryBean(){
return new MyFactoryBean();
}
測試程式碼如下:
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
Object object = applicationContext2.getBean("getMyFactoryBean");
System.out.println("例項bean為 === "+object);
Object object2 = applicationContext2.getBean("&getMyFactoryBean");
System.out.println("例項bean為 === "+object2);
執行結果如下:
例項bean為 === [email protected]
例項bean為 === [email protected]
怎麼樣注意上面測試的列印結果,是不是跟我們開頭說的那樣根據該Bean的ID從BeanFactory中獲取的實際上是FactoryBean的getObject()返回的物件,而不是FactoryBean本身,如果要獲取FactoryBean物件,請在id前面加一個&符號來獲取