Spring是壹個bean依賴註入容器,容器是BF,它的上級對象是applicationContxt,applicationContxt在容器功能上附加了壹下新的功能。我們使用spring時,用的都是applicationConext的實現類。
我們在初始化這些applicationConext時,最終調用的都是org.springframework.context.support.AbstractApplicationContext#refresh方法用於容器的初始化。這個方法是壹個模板方法,規定了容器實例化的步驟。其中BF初始化完成後,會調用BF的後置處理器對BF進行後置處理。而後置處理器的調用是在org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors這個方法中進行的。
BF的後置處理器有兩種,BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor。BF後置處理器和BD(BeanDefinition)後置處理器。BD後置處理器是BF後置處理器的子接口。下面是BF後置處理器的api截圖。
invokeBeanFactoryPostProcessors方法內,調用後置處理器的步驟如下:
在AnnotationConfigApplicationContext上下文中,會有壹個關鍵的BD後置處理器:ConfigurationClassPostProcessor。它是用來掃描所有交給spring管理的註解類的。將其解析為BD實例放到AC中去。
spring管理的是bean,所以bean的實例化是壹個重要的過程。spring是通過org.springframework.beans.factory.support.AbstractBeanFactory#getBean方法實例化並初始化Bean。實例化Bean的過程中,可以通過bean的後置處理器插手Bean的實例化過程。
Bean的實例化過程如下:
在這個過程中,spring內設了8個bean的後置處理器調用點,用來進行擴展。
Bean後置處理器有五種:
Bean後置處理器的API截圖: