? ? ? ? 在spring中有beanPostProcesor這個(gè)類匀钧,這個(gè)類主要用到spring的IOC中,但是要說清楚這個(gè)類谬返,前提還是要理解spring的IOC的設(shè)計(jì)思想之斯。
? ? ? ? spring的IOC一般理解是字面意思依賴注入、控制翻轉(zhuǎn)遣铝,這樣理解還是太泛化佑刷,不夠詳細(xì),因?yàn)檫€是觸及不到核心酿炸,又有人說IOC不就是spring幫忙托管對象實(shí)例项乒,不用再一個(gè)一個(gè)new出來,這樣理解也是正確的梁沧,但是還是沒有觸及到最核心部分檀何。spring的IOC設(shè)計(jì)初衷我想應(yīng)該不僅是托管對象實(shí)例,還要理清對象實(shí)例之間的關(guān)系廷支,還可以根據(jù)相關(guān)情況返回代理對象频鉴,并且還要做了相應(yīng)的前后置的處理,這種前后置的處理就是我們今天的主角-beanPostProcesor恋拍。
主要理解的是以上接口結(jié)構(gòu)垛孔。
beanPostProcessor是根類,所有前后置均源于此施敢,此外還有繼承自beanPostProcessor的MergedBeanDefinitionPostProcessor周荐,這個(gè)MergedBeanDefinitionPostProcessor很重要,它主要的功能是調(diào)整RootBeanDefinition的參數(shù)僵娃,在實(shí)例化對象之后概作,注入?yún)?shù)之前修改RootBeanDefinition以達(dá)到修改注入?yún)?shù)的目的(這個(gè)很重要)。
以來注入流程圖如下:
? ? ? ? ?我整理出了spring依賴注入的詳細(xì)流程圖默怨,在上面這個(gè)流程圖當(dāng)中詳細(xì)說明了每一個(gè)步驟中具體做了什么讯榕,還說明了我們在哪里可以擴(kuò)展些什么。
? ? ? ? 綜上所述匙睹,spring的IOC是個(gè)超級bean管理容器愚屁,并且在初始化過程中還可以完成以下幾種操作:
1、用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation
? ? ? ? ? ? 1)方法返回代理對象來替代痕檬、增強(qiáng)原對象(例如:aop)
? ? ? ? ? ? 2)也可以修改即將要注入的值
2霎槐、用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition修改bean的定義
3、用InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法來注入值