05_bean factoryのバックグラウンドプロセッサの実行
3959 ワード
// Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory);
をすべて表示PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
1.1. BeanDefinitionRegistryPostProcessorsを実行してから
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set processedBeans = new HashSet();
1.2. beanFactoryがBeanDefinitionRegistryインタフェースを実装している場合、受信したbean factory後置プロセッサは、BeanDefinitionRegistryPostProcessorインタフェースを実装した後置プロセッサと他の後置プロセッサに分けられ、BeanDefinitionRegistryPostProcessorのpostProcessorのpostProcessBeanDefinitionRegistryメソッドがコールバックされる.
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
regularPostProcessors.add(postProcessor);
}
}
注意:BeanDefinitionRegistryPostProcessorの役割は、bean定義情報の保存センターにbeanの定義情報を登録することであり、beanを登録する方法です.
/**
* e.g.: bean, , beanName firstBean Dog, beanName secondBean Cat
* @param registry bean beanFactory BeanDefinitionRegistry bean
*/
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Dog.class);
registry.registerBeanDefinition("firstBean", rootBeanDefinition);
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Cat.class).getBeanDefinition();
registry.registerBeanDefinition("secondBean", beanDefinition);
}
1.3.すべてのBeanDefinitionRegistryPostProcessorを取得し、実装されたインタフェースに従って、
PriorityOrdered -> Ordered ->
の順序を並べ、それぞれpostProcessBeanDefinitionRegistry
にコールバックする//
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
// BeanDefinitionRegistryPostProcessor
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
// PriorityOrdered , currentRegistryProcessors
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
// currentRegistryProcessors
sortPostProcessors(currentRegistryProcessors, beanFactory);
//registryProcessors ,
registryProcessors.addAll(currentRegistryProcessors);
// BeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
// currentRegistryProcessors
currentRegistryProcessors.clear();
// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
//...
// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
//...
// Ordered BeanDefinitionRegistryPostProcessors
1.4コールバックbean factoryの
postProcessBeanFactory
方法// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
1.5 beanFactoryがBeanDefinitionRegistryインタフェースを実装していない場合、bean factoryの
postProcessBeanFactory
メソッド1.6を直接コールバックしてすべてのBeanFactoryPostProcessorを取得し、上記の手順と同様にソートを再分類し、postProcessBeanFactory
にコールバックする.