Spring?BeanFactory?與?FactoryBean?的區(qū)別詳情
前言:
在 Spring
中, IOC
是很重要的概念,其本質(zhì)就是 map 結(jié)構(gòu),存儲容器和業(yè)務(wù) Bean 信息。但是BeanFactory
和 FactoryBean
的區(qū)別卻是一個很重要的知識點(diǎn),在本文中將結(jié)合源碼進(jìn)行分析講解。
區(qū)別和聯(lián)系
BeanFactory
在 Spring
中,所有的 Bean
都是由 BeanFactory
(也就是 IOC 容器)來進(jìn)行管理的。BeanFactory
定義了容器的基本形式,并規(guī)定了 IOC 容器的基本接口以及生命周期,針對 BeanFactory 的實(shí)現(xiàn)類也有很多,比如ApplicationContext
、DefaultListableBeanFactory
、XmlBeanFactory
都是其添加了附加功能的接口。BeanFactory
創(chuàng)建的 Bean
對象需要遵循以下的生命周期形式,并且 Bean
的生產(chǎn)都是通過反射機(jī)制來實(shí)現(xiàn)的。
在英文中,Aware
是意識的意思,可以看到 BeanFactory
的生命周期流程包含了諸多的 Aware
接口:
以下為 BeanFactory
接口生命周期相關(guān)的一下方法,在項(xiàng)目開發(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)行處理。
FactoryBean
但是在某些具體的情況下,實(shí)例化 Bean
的操作會很復(fù)雜,按照其要求需要配置大量的屬性,此時 Bean
的配置靈活性就受到了限制,此時就需要使用到 FactoryBean
了,該接口可以按照用戶的需求來構(gòu)造 Bean
對象,而不再遵守 Bean
生命周期的流程。Spring
自身就提供了很多 FactoryBean
的實(shí)現(xiàn), 它們隱藏了實(shí)例化的一系列復(fù)雜細(xì)節(jié),給上層應(yīng)用帶來了便利。自從 Srping3.0 開始 FactoryBean
開始支持泛型,即接口聲明改為 FactoryBean<T>
的形式,在 FactoryBean
的應(yīng)用中,SqlSessionFactoryBean
就是很好的實(shí)踐,在操作數(shù)據(jù)庫的過程中,提供了創(chuàng)建 SqlSession
的工廠 Factory
。
總結(jié)
BeanFactory
提供一個 Spring IOC 容器規(guī)范, 能夠生產(chǎn)和管理 Bean 的一個工廠接口。但是 FactoryBean
是一種特殊的 Bean 創(chuàng)建方式,可以不必遵循 IOC 容器的規(guī)范,而是對 Bean 的一種擴(kuò)展。對于復(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封裝響應(yīng)數(shù)據(jù)實(shí)現(xiàn)過程詳解
這篇文章主要介紹了SpringBoot封裝響應(yīng)數(shù)據(jù)實(shí)現(xiàn)過程,SpringBoot響應(yīng)數(shù)據(jù)封裝是指在SpringBoot應(yīng)用程序中,將返回的數(shù)據(jù)進(jìn)行封裝,以便于前端頁面或其他客戶端使用,感興趣想要詳細(xì)了解可以參考下文2023-05-05詳解SpringBoot修改啟動端口server.port的四種方式
這篇文章主要介紹了詳解SpringBoot修改啟動端口server.port的四種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java中Integer的parseInt和valueOf的區(qū)別詳解
這篇文章主要介紹了Java中Integer的parseInt和valueOf的區(qū)別詳解,nteger.parseInt(s)是把字符串解析成int基本類型,Integer.valueOf(s)是把字符串解析成Integer對象類型,其實(shí)int就是Integer解包裝,Integer就是int的包裝,需要的朋友可以參考下2023-11-11解決SecureRandom.getInstanceStrong()引發(fā)的線程阻塞問題
這篇文章主要介紹了解決SecureRandom.getInstanceStrong()引發(fā)的線程阻塞問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12