Spring?BeanFactory?與?FactoryBean?的區(qū)別詳情
前言:
在 Spring 中, IOC 是很重要的概念,其本質(zhì)就是 map 結(jié)構(gòu),存儲容器和業(yè)務(wù) Bean 信息。但是BeanFactory 和 FactoryBean 的區(qū)別卻是一個很重要的知識點,在本文中將結(jié)合源碼進行分析講解。
區(qū)別和聯(lián)系
BeanFactory
在 Spring 中,所有的 Bean 都是由 BeanFactory (也就是 IOC 容器)來進行管理的。BeanFactory 定義了容器的基本形式,并規(guī)定了 IOC 容器的基本接口以及生命周期,針對 BeanFactory 的實現(xiàn)類也有很多,比如ApplicationContext、DefaultListableBeanFactory、XmlBeanFactory 都是其添加了附加功能的接口。BeanFactory 創(chuàng)建的 Bean 對象需要遵循以下的生命周期形式,并且 Bean 的生產(chǎn)都是通過反射機制來實現(xiàn)的。
在英文中,Aware 是意識的意思,可以看到 BeanFactory 的生命周期流程包含了諸多的 Aware 接口:

以下為 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 本身,那么需要添加 & 符號作為前綴進行處理。

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。

總結(jié)
BeanFactory 提供一個 Spring IOC 容器規(guī)范, 能夠生產(chǎn)和管理 Bean 的一個工廠接口。但是 FactoryBean 是一種特殊的 Bean 創(chuàng)建方式,可以不必遵循 IOC 容器的規(guī)范,而是對 Bean 的一種擴展。對于復(fù)雜 Bean 對象創(chuàng)建和使用其可以封裝對象的創(chuàng)建細(xì)節(jié)。
到此這篇關(guān)于Spring BeanFactory 與 FactoryBean 的區(qū)別詳情的文章就介紹到這了,更多相關(guān)Spring BeanFactory 與 FactoryBean 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot攔截器過濾token,并返回結(jié)果及異常處理操作
這篇文章主要介紹了springboot攔截器過濾token,并返回結(jié)果及異常處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
idea中項目前端網(wǎng)頁圖標(biāo)不顯示的原因及解決
這篇文章主要介紹了idea中項目前端網(wǎng)頁圖標(biāo)不顯示的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
Java如何獲取List<String>中的String詳解
工作了這么長時間了,一直沒有記錄的習(xí)慣,以至于導(dǎo)致我即便是查過的東西總會忘記,下面這篇文章主要給大家介紹了關(guān)于Java如何獲取List<String>中String的相關(guān)資料,需要的朋友可以參考下2022-02-02
AsyncHttpClient?ChannelPool線程池頻道池源碼流程解析
這篇文章主要為大家介紹了AsyncHttpClient ChannelPool線程池頻道池源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
SpringBoot核心配置文件bootstrap與application用法
Spring Boot中有兩種配置文件:bootstrap和application,bootstrap是應(yīng)用程序的父上下文,優(yōu)先加載,不能被本地相同配置覆蓋,bootstrap主要用于加載外部配置信息,如SpringCloudConfig配置中心的配置,application主要用于Spring Boot項目的自動化配置2024-12-12
SpringSecurity根據(jù)自定義異常返回登錄錯誤提示信息(賬戶鎖定)
本文介紹了在SpringSecurity中根據(jù)自定義異常返回登錄錯誤提示信息的方法,特別是在賬戶鎖定時,通過記錄輸錯次數(shù)、重寫校驗方法并拋出自定義異常,感興趣的可以了解一下2025-01-01
java多線程CyclicBarrier的使用案例,讓線程起步走
這篇文章主要介紹了java多線程CyclicBarrier的使用案例,讓線程起步走!具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
SpringBoot使用RabbitMQ延時隊列(小白必備)
這篇文章主要介紹了SpringBoot使用RabbitMQ延時隊列(小白必備),詳細(xì)的介紹延遲隊列的使用場景及其如何使用,需要的小伙伴可以一起來了解一下2019-12-12

