1. 程式人生 > 其它 >講講BeanFactory和FactoryBean的區別

講講BeanFactory和FactoryBean的區別

一、兩者區別

BeanFactory是個Factory,也就是IOC容器或物件工廠,FactoryBean是個Bean。
BeanFactory是Spring提供的存放Bean的工廠,FactoryBean是一個可生產Bean的工廠Bean。

在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)來進行管理的。但對FactoryBean而言,這個Bean不是簡單的Bean,而是一個能生產或者修飾物件生成的工廠Bean,它的實現與設計模式中的工廠模式和修飾器模式類似。

BeanFactory和FactoryBean都可以用來建立物件,只不過建立的流程和方式不同!
當使用BeanFactory的時候,必須要嚴格的遵守bean的生命週期,經過一系列繁雜的步驟之後可以創建出單例物件,是流水線式的建立過程。
而FactoryBean是使用者可以自定義bean物件的建立流程,不需要按照bean的生命週期來建立,在此介面中包含了三個方法:

isSingleton:判斷是否是單例物件
getObjectType:獲取物件的型別
getObject:在此方法中可以自己建立物件,使用new的方式或者使用代理的方式都可以,使用者可以按照自己的需要隨意去建立物件,在很多框架繼承的時候都會實現FactoryBean介面,比如Feign!

二、BeanFactory

BeanFactory定義了IOC容器的最基本形式,並提供了IOC容器應遵守的的最基本的介面,也就是Spring IOC所遵守的最底層和最基本的程式設計規範。
在Spring程式碼中,BeanFactory只是個介面,並不是IOC容器的具體實現,但是Spring容器給出了很多種實現,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都是附加了某種功能的實現。

ApplicationContext,是BeanFactory的子介面!

使用場景

從Ioc容器中獲取Bean(byName or byType)
檢索Ioc容器中是否包含指定的Bean
判斷Bean是否為單例

三、FactoryBean

FactoryBean是Spring提供給使用者自定義Bean的工廠Bean,隱藏建立物件的細節。

一般情況下,Spring通過反射機制利用的class屬性指定實現類例項化Bean,在某些情況下,例項化Bean過程比較複雜。
如果按照傳統的方式,則需要在中提供大量的配置資訊。配置方式的靈活性是受限的,這時採用編碼的方式可能會得到一個簡單的方案。
Spring為此提供了一個org.springframework.bean.factory.FactoryBean的工廠類介面,使用者可以通過實現該介面定製例項化Bean的邏輯。

使用場景

FactoryBean在Spring中最為典型的一個應用就是用來建立AOP的代理物件。

我們知道AOP實際上是Spring在執行時建立了一個代理物件,也就是說這個物件,是我們在執行時建立的,而不是一開始就定義好的,這很符合工廠方法模式。更形象地說,AOP代理物件通過Java的反射機制,在執行時建立了一個代理物件,在代理物件的目標方法中根據業務要求織入了相應的方法。
這個物件在Spring中就是——ProxyFactoryBean。

所以,FactoryBean為我們例項化Bean提供了一個更為靈活的方式,我們可以通過FactoryBean創建出更為複雜的Bean例項。