docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(六):注册BeanPostProcessor.md
ģǼ
BeanPostProcessor: registerBeanPostProcessors(beanFactory)ʽǰҪȷ
BeanFactoryPostProcessorΪ BeanFactory ĺôԶ BeanFactory һЩBeanPostProcessorΪ Bean ĺôԶ Bean һЩҪĵ BeanPostProcessor ǰ BeanFactoryPostProcessor Ūˡ
ҪǶ BeanPostProcessor register (registerBeanPostProcessors(beanFactory)) BeanPostProcessor עᵽ BeanFactory УôʲôʱأȻǶ Bean IJȻ bean ֮ˡ
BeanPostProcessorҲ spring һҪڸϸԲο spring ֮ BeanPostProcessors
ϻ˵ֱϴ룬ͬأԲҪķֻ
|-AbstractApplicationContext#refresh
|-AbstractApplicationContext#registerBeanPostProcessors
|-PostProcessorRegistrationDelegate
#registerBeanPostProcessors(ConfigurableListableBeanFactory, AbstractApplicationContext)
յõ PostProcessorRegistrationDelegate#registerBeanPostProcessors£
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// ȡspringе BeanPostProcessorһbean:
// org.springframework.context.annotation.internalAutowiredAnnotationProcessor
// AutowiredAnnotationBeanPostProcessor
String[] postProcessorNames = beanFactory
.getBeanNamesForType(BeanPostProcessor.class, true, false);
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount()
+ 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(
new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
// ȻȡʵPriorityOrderedBeanPostProcessor
// ٻȡʵOrderedBeanPostProcessor
// ٻȡBeanPostProcessor
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// priorityOrderedPostProcessorȻӵbeanFactory
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
List<BeanPostProcessor> orderedPostProcessors
= new ArrayList<>(orderedPostProcessorNames.size());
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// orderedPostProcessorȻӵbeanFactory
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
List<BeanPostProcessor> nonOrderedPostProcessors
= new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// µBeanPostProcessorȻӵbeanFactory
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// internalPostProcessorȻӵbeanFactory
// AutowiredAnnotationBeanPostProcessorʵMergedBeanDefinitionPostProcessor
// ٴע
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
ҪǶ BeanFactoryPostProcessor ע£
PriorityOrdered BeanPostProcessor עᵽ beanFactory УOrdered BeanPostProcessor עᵽ beanFactory УBeanPostProcessor עᵽ beanFactory УMergedBeanDefinitionPostProcessor BeanPostProcessor ٴעᵽ beanFactory Сʵϣ demo01 ԣע bean ֻһAutowiredAnnotationBeanPostProcessorͬʱʵ MergedBeanDefinitionPostProcessor PriorityOrdered˻עΡ
ע˶ AutowiredAnnotationBeanPostProcessorֻһǽ registerBeanPostProcessors spring עģһ·ȥ뵽 AbstractBeanFactory#addBeanPostProcessor:
AbstractBeanFactory#addBeanPostProcessor
private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();
@Override
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
// ȽƳ˶עbeanPostProcessorsҲֻһ
this.beanPostProcessors.remove(beanPostProcessor);
if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
this.hasInstantiationAwareBeanPostProcessors = true;
}
if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
this.hasDestructionAwareBeanPostProcessors = true;
}
this.beanPostProcessors.add(beanPostProcessor);
}
Կνעᵽ BeanFactoryʵǰ beanPostProcessor 뵽 BeanFactory beanPostProcessors С
Ľ beanPostProcessor עᣬ beanPostProcessor ĵãķᵽĵķȵɣ
ԭӣhttps://my.oschina.net/funcy/blog/4657181 ߸ˮƽд֮ӭָԭףҵתϵȨҵתע