invokeBeanFactoryPostProcessors
方法會實例化所有BeanFactoryPostProcessor
以及其子類BeanDefinitionRegistryPostProcessor
。這兩個類主要針對的是BeanFactory
的,其作用是在BeanDefinition
創建之後,Bean 實例化對象前對BeanDefinition
對象相關屬性進行修改;另外還有一個類叫BeanPostProcessor
,該類主要針對的是 Bean 操作的。關於這兩個類的區別我會在下一篇內容介紹。
1. 在講AbstractApplicationContext.refresh()
的invokeBeanFactoryPostProcessors
開始之前。在講之前先簡單說下爲啥沒有講prepareBeanFactory
和postProcessBeanFactory
兩個方法,因爲這兩個方法都特別簡單,第一個方法是爲BeanFactory
設置各種各樣的屬性,包括一些BeanPostProcessor
的設置(BeanPostProcessor
後面會專門講解)等等,第二個方法沒有具體實現,是爲開發者留出擴展的。
AbstractApplicationContext.invokeBeanFactoryPostProcessors()方法實現
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
// 獲取context中已添加的beanFactoryPostProcessors
// 實例化並調用所有BeanFactoryPostProcessors
// 主要實現也是在該方法裏面進行實現
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
2. 該方法的主要實現在invokeBeanFactoryPostProcessors
方法裏面進行實現的。(雖然這個方法特別長,但是邏輯很簡單,耐心看下去)
BeanFactoryPostProcessor
:一切處理BeanFactory
的父接口BeanDefinitionRegistryPostProcessor
:實現了BeanFactoryPostProcessor
接口的接口
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()方法實現
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<>();
// Step1:beanFactory是BeanDefinitionRegistry接口或者是其子類
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
// Step2:存放普通的beanFactoryPostProcessors
List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<>();
// Step3:存放beanDefinitionRegistryPostProcessors
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new LinkedList<>();
// Step4:首先處理接口傳進來的factoryPostProcessors
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
// Step5:實現了BeanDefinitionRegistryPostProcessor接口的factoryPostProcessor
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
// Step6:直接調用其實現
registryProcessor.postProcessBeanDefinitionRegistry(registry);
// Step7:添加到registryProcessors裏面,後面調用 BeanFactoryPostProcessor.postProcessBeanFactory()方法
registryProcessors.add(registryProcessor);
}
else {
// Step8:非BeanFactoryProcessor及其子類的,直接添加到regularPostProcessors裏面,後面調用執行postProcessorBeanFactory方法
regularPostProcessors.add(postProcessor);
}
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let the bean factory post-processors apply to them!
// Separate between BeanDefinitionRegistryPostProcessors that implement
// PriorityOrdered, Ordered, and the rest.
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
// Step9:獲取所有BeanDefinitionRegistryPostProcessor實現的子類並且實現了PriorityOrdered接口的factoryPostProcessor
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
// Step10:排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
// Step11:添加到registryProcessors中,後面調用postProcessorBeanFactory方法
registryProcessors.addAll(currentRegistryProcessors);
// Step12:遍歷執行每個factoryPostProcessor的postProcessBeanDefinitionRegistry方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
// Step13:清空
currentRegistryProcessors.clear();
// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
// Step14:獲取所有BeanDefinitionRegistryPostProcessor並且實現了Ordered接口的factoryPostProcessor
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
// Step15:排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
// Step16:添加到registryProcessors中,後面調用postProcessorBeanFactory方法
registryProcessors.addAll(currentRegistryProcessors);
// Step17:遍歷每個factoryPostProcessor的postProcessorBeanDefinitionRegistry方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
// Step18:清空
currentRegistryProcessors.clear();
// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
// Step19:獲取所有實現了BeanDefinitionRegistryPostProcessor接口的類,且沒有實現PriorityOrdered接口和Ordered接口的類
boolean reiterate = true;
while (reiterate) {
reiterate = false;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
reiterate = true;
}
}
// Step20:排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
// Step21:添加到registryProcessors中,後面調用PostProcessorBeanFactory方法
registryProcessors.addAll(currentRegistryProcessors);
// Step22:遍歷每個factoryPostProcessor的PostProcessorBeanDefinitionRegistry方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}
// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
// Step23:所有實現了BeanDefinitionRegistryPostProcessor接口的類,調用beanFactoryPostProcessors方法
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
// Step24:所有實現了BeanFactoryPostProcessor接口的類,調用BeanFactoryPostProcessor方法
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
else {
// Invoke factory processors registered with the context instance.
// Step26:所有非BeanDefinitionRegistry接口及其子類的工廠,直接調用BeanFactoryPostProcessor方法
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let the bean factory post-processors apply to them!
// Step27:獲取所有實現了BeanFactoryPostProcessor接口的類名
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
// Step28:跳過已經invoke的factoryPostProcessor
if (processedBeans.contains(ppName)) {
// skip - already processed in first phase above
}
// Step29:實現了BeanFactoryPostProcessor接口並且實現了PriorityOrdered接口的類
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
// Step30:實現了BeanFactoryPostProcessor並且實現了Ordered接口的類
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
// Step31:普通的BeanFactoryPostProcessor類
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
// Step32:排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// Step33:調用BeanFactoryPostProcessor方法
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
// Step34:實現了Ordered接口排序並調用BeanFactoryPostProcessor方法
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
// Finally, invoke all other BeanFactoryPostProcessors.
// Step35:普通的BeanFactoryPostProcessor調用beanFactoryPostProcessor方法
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
// Clear cached merged bean definitions since the post-processors might have
// modified the original metadata, e.g. replacing placeholders in values...
beanFactory.clearMetadataCache();
}
總結
先加載預先在上線文中定義的
BeanFactoryPostProcessor
然後加載實現了
BeanDefinitionRegistryPostProcessor
接口的BeanFactoryPostProcessor
然後加載實現了
BeanFactoryPostProcessor
接口的類在 Spring 和 mybatis 整合中,
MapperScannerConfigurer.java
就實現了BeanDefinitionRegistryPostProcessor
接口,在其實現的方法postProcessorBeanDefinitionRegistry
中,掃描basePackage
指定的路徑,將該目錄下的類封裝成BeanDefinitio
n 並加載到BeanFactory
中。所以項目中的接口不需要配置在 XML 文件中或者用註解聲明,而可以直接使用 Dao 類對應的實例化對象。再比如PropertySourcesPlaceholderConfigurer
(實現了context:property-placeholder
的功能),主要作用是替換掉 ${} 佔位符的內容,其重寫了postProcessorBeanFactory
方法
講完invokeBeanFactoryPostProcessors
相關實現後,下一篇我們來看看registerBeanPostProcessors
都實現了些什麼功能,它和本篇文章將的invokeBeanFactoryPostProcessors
方法有什麼區別。
歡迎關注我,共同學習