Spring中一些概念的總結

對象和Bean的區別?


個人觀點:所謂的bean也是一個java對象,只不過這個對象是通過spring定義的,而一開始就是通過標籤定義的,所以叫做bean。


普通對象和Bean對象還有其他區別,因為Bean對象是由Spring生成的,Spring在生成Bean對象的過程中,會歷經很多其他步驟,比如屬性注入,aop,new實例,調用初始化方法。


如何理解BeanDefinition?

顧名思義,BeanDefinition是用來描述一個Bean的,Spring會根據BeanDefinition來生成一個Bean。


BeanFactory和FactoryBean的區別


BeanFactory

BeanFactory是Spring IOC容器的頂級接口,其實現類有XMLBeanFactory,
DefaultListableBeanFactory以及
AnnotationConfigApplicationContext等。BeanFactory為Spring管理Bean提供了一套通用的規範。接口中提供的一些方法如下:

<code>

boolean

containsBean(

String

beanName)

Object

getBean(

String

)

Object

getBean(

String

, Class) Class getType(

String

name)

boolean

isSingleton(

String

)

String

[] getAliases(

String

name)/<code>


可以通過BeanFactory獲得Bean。


FactoryBean

FactoryBean首先也是一個Bean,但不是簡單的Bean,而是一個能生產對象的工廠Bean,可以通過定義FactoryBean中的getObject()方法來創建生成過程比較複雜的Bean。


如何理解BeanFactoryPostProcessor?

BeanFactoryPostProcessor也叫做BeanFactory後置處理器。這裡包括兩個概念,一個是BeanFactory,一個是後置處理器。


BeanFactory表示Bean工廠,可以基於BeanDefinition來生成Bean對象,所以在BeanFactory中存在所有的BeanDefinition。

後置處理器可以理解為:當某物品生產好了以後,可以進一步通過後置處理器來對此物品進行處理。


所以BeanFactoryPostProcessor可以理解為,可以得到BeanFactory對象並對它進行處理,比如修改它其中的某個BeanDefinition,或者直接向BeanFactory中添加某個對象作為bean。


如何理解BeanDefinitionRegistryPostProcessor?


BeanDefinitionRegistryPostProcessor是一個接口,繼承了BeanFactoryPostProcessor,所以它也是一個BeanFactory後置處理器,所以它可以操作BeanFactory。


它特殊的地方在於,它擁有的功能比BeanFactoryPostProcessor多,比如BeanFactoryPostProcessor是不能向BeanFactory中添加BeanDefinition的(只能添加Bean對象),但是
BeanDefinitionRegistryPostProcessor是可以向BeanFactory中添加BeanDefinition的。


如何理解@Import與ImportBeanDefinitionRegistrar?

Import註解

@Import首先是一個註解,在Spring中是用來向Spring容器中導入Bean的。換個角度理解,就是我們一般都是通過在某個類上加上@Component註解來標誌一個bean的,但如果我們希望以一種更靈活的方式去定義bean的話,就可以利用@Import註解。


@Import註解所指定的類,在Spring啟動過程中會對指定的類進行判斷,判斷當前類是不是實現了比較特殊的接口,比如
ImportBeanDefinitionRegistrar,如果存在特殊的接口就執行特殊的邏輯,如果沒有則生成該類對應的BeanDefinition並放入BeanFactory中。


ImportBeanDefinitionRegistrar

通過Import註解可以註冊bean,雖然它也支持同時註冊多個bean,但是不方便,特別是當我們想通過實現一些複雜邏輯來註冊bean的話,僅僅通過Import註解是不方便的,這時就可以使用
ImportBeanDefinitionRegistrar這個接口來動態的註冊bean了,我這裡說的註冊bean指的是:通過生成BeanDefinition,並且把BeanDefinition放入BeanFactory中。


Spring中一些概念的總結


那麼你們又是如何理解BeanDefinitionRegistry和BeanFactory的呢?


分享到:


相關文章: