溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring?BeanFactory與FactoryBean的區(qū)別是什么

發(fā)布時間:2022-05-05 10:28:28 來源:億速云 閱讀:121 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Spring BeanFactory與FactoryBean的區(qū)別是什么的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Spring BeanFactory與FactoryBean的區(qū)別是什么文章都會有所收獲,下面我們一起來看看吧。

    前言:

    在 Spring 中, IOC 是很重要的概念,其本質(zhì)就是 map 結(jié)構(gòu),存儲容器和業(yè)務(wù) Bean 信息。但是 BeanFactory 和 FactoryBean 的區(qū)別卻是一個很重要的知識點,在本文中將結(jié)合源碼進(jìn)行分析講解。

    區(qū)別和聯(lián)系

    BeanFactory

    在 Spring 中,所有的 Bean 都是由 BeanFactory (也就是 IOC 容器)來進(jìn)行管理的。BeanFactory 定義了容器的基本形式,并規(guī)定了 IOC 容器的基本接口以及生命周期,針對 BeanFactory 的實現(xiàn)類也有很多,比如ApplicationContext、DefaultListableBeanFactory、XmlBeanFactory 都是其添加了附加功能的接口。BeanFactory 創(chuàng)建的 Bean 對象需要遵循以下的生命周期形式,并且 Bean 的生產(chǎn)都是通過反射機制來實現(xiàn)的。

    在英文中,Aware 是意識的意思,可以看到 BeanFactory 的生命周期流程包含了諸多的 Aware 接口:

    Spring?BeanFactory與FactoryBean的區(qū)別是什么

    以下為 BeanFactory 接口生命周期相關(guān)的一下方法,在項目開發(fā)中,ApplicationContextAware、InitializingBean 和 DisposableBean 有這廣泛的應(yīng)用。

    • BeanNameAware.setBeanName 用于設(shè)置 Bean 的名稱

    • BeanClassLoaderAware.setBeanClassLoader 設(shè)置類加載器

    • BeanFactoryAware.setBeanFactory 設(shè)置 bean 工廠

    • ResourceLoaderAware.setResourceLoader 設(shè)置資源加載器

    • ApplicationEventPublisherAware.setApplicationEventPublisher 設(shè)置事件發(fā)布器

    • MessageSourceAware.setMessageSource 設(shè)置信息資源

    • ApplicationContextAware.setApplicationContext 設(shè)置應(yīng)用上下文

    • ServletContextAware.setServletContext 設(shè)置 Servlet 上下文

    • BeanPostProcessor.postProcessBeforeInitialization 前置處理器

    • InitializingBean.afterPropertiesSet Bean 初始化操作

    • RootBeanDefinition.getInitMethodName 設(shè)置Bean 的初始化方法名稱

    • BeanPostProcessor.postProcessAfterInitialization 后置處理器

    • DisposableBean.destroy 設(shè)置 Bean 銷毀

    • RootBeanDefinition.getDestroyMethodName 獲取 Bean 銷毀的方法

    默認(rèn)情況下,如果直接調(diào)用 getBean 方法,將會返回一個工廠創(chuàng)造的對象,如果想獲取 Bean 本身,那么需要添加 & 符號作為前綴進(jìn)行處理。

    Spring?BeanFactory與FactoryBean的區(qū)別是什么

    FactoryBean

    但是在某些具體的情況下,實例化 Bean 的操作會很復(fù)雜,按照其要求需要配置大量的屬性,此時 Bean 的配置靈活性就受到了限制,此時就需要使用到 FactoryBean 了,該接口可以按照用戶的需求來構(gòu)造 Bean 對象,而不再遵守 Bean 生命周期的流程。Spring 自身就提供了很多 FactoryBean 的實現(xiàn), 它們隱藏了實例化的一系列復(fù)雜細(xì)節(jié),給上層應(yīng)用帶來了便利。自從 Srping3.0 開始 FactoryBean 開始支持泛型,即接口聲明改為 FactoryBean<T> 的形式,在 FactoryBean 的應(yīng)用中,SqlSessionFactoryBean 就是很好的實踐,在操作數(shù)據(jù)庫的過程中,提供了創(chuàng)建 SqlSession 的工廠 Factory。 

    Spring?BeanFactory與FactoryBean的區(qū)別是什么

    關(guān)于“Spring BeanFactory與FactoryBean的區(qū)別是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Spring BeanFactory與FactoryBean的區(qū)別是什么”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI