4 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
BeanFactory:實(shí)現(xiàn)這個(gè)接口的對(duì)象它們可以作為它們自己的工廠(這個(gè)根接口,用來訪問spring容器),其實(shí)spring可以成為容器很大一部分是依賴這個(gè)接口
FactoryBean:如果某個(gè)對(duì)象實(shí)現(xiàn)了這個(gè)接口,這個(gè)對(duì)象會(huì)被當(dāng)做一個(gè)工廠(為了讓某個(gè)對(duì)象暴露),而不是直接以一個(gè)對(duì)象暴露自己。
以上為英文渣翻譯。
說說我的理解:
之前沒有研究過這兩個(gè)對(duì)象的區(qū)別,剛剛看了一下源碼的翻譯和一些類的實(shí)現(xiàn),發(fā)現(xiàn)挺有意思的。
首先BeanFactory,需要知道對(duì)象的一系列屬性(通過XML配置),然后再構(gòu)造對(duì)象,并對(duì)對(duì)象進(jìn)行管理,如對(duì)象的生命周期,是否單例,以及復(fù)合對(duì)象(對(duì)象有其他對(duì)象的引用)的組裝(自動(dòng)裝配),對(duì)象初始化的一些準(zhǔn)備工作,屬性注入等等,能說一堆。可以說BeanFactory更像一個(gè)公司,而不像是FactoryBean,這個(gè)對(duì)象更像一個(gè)工廠,是專門生產(chǎn)某一類對(duì)象,幾乎沒有管理功能,只是單一的構(gòu)造對(duì)象而已。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
BeanFactory是IOC容器,本身并不創(chuàng)建Bean,而是通過一系列組件的配合管理Bean。主要的方法是getBean,從容器中獲取Bean的實(shí)例。
FactoryBean是創(chuàng)建Bean的工廠,它們都實(shí)現(xiàn)了FactoryBean接口,主要的方法是getObject,該方法返回的是FactoryBean想要?jiǎng)?chuàng)建的class的實(shí)例,而不是FactoryBean自己的實(shí)例。在Spring中有超過50+的FactoryBean。這些FactoryBean的作用是不同的。
之一是:通過FactoryBean創(chuàng)建指定class的實(shí)例,并是該實(shí)例得到能力的增強(qiáng)。例如:TransactionProxyFactoryBean就是讓普通的Service具有了事務(wù)的能力。它的getObject返回的是普通的Service的實(shí)例,但是通過動(dòng)態(tài)代理的方式對(duì)普通Service的實(shí)例進(jìn)行了事務(wù)能力的增強(qiáng)。
之一是:某些Bean在特定場景下的實(shí)例化過程比較復(fù)雜,那么將這些實(shí)例化過程通過FactoryBean的方式進(jìn)行封裝,就能夠快速的制造出該場景下的目標(biāo)對(duì)象的實(shí)例。如:EhCacheFactoryBean。
所以一個(gè)最核心的功能是管理Bean的IOC容器,一個(gè)是某類Bean的生產(chǎn)工廠。所以更多的時(shí)候,我們理解ApplicationContext接口和FactoryBean接口的作用就很容易理解了。
添加回答
舉報(bào)