Spring 5.x Source trip twelve invokeBeanFactoryPostProcessors four
The implementation of the remaining post-processor BeanFactoryPostProcessor
First press PriorityOrdered
, Ordered
and generally BeanFactoryPostProcessor
not processed into three sets of processors, and processed separately in sequence, except that our custom which, is inside EventListenerMethodProcessor
of.
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) {
if (processedBeans.contains(ppName)) {//处理过的就不处理
// skip - already processed in first phase above
}
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
//先处理priorityOrderedPostProcessors排序和回调
// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
//再处理orderedPostProcessors排序和回调
// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
//最后是剩下的
// Finally, invoke all other BeanFactoryPostProcessors.
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
EventListenerMethodProcessor的postProcessBeanFactory
From bean
Find name and create EventListenerFactory
the type of object returned, then save to eventListenerFactories
the fact the plant is to create an event listener, you can create an event listener later.
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
this.beanFactory = beanFactory;
Map<String, EventListenerFactory> beans = beanFactory.getBeansOfType(EventListenerFactory.class, false, false);
List<EventListenerFactory> factories = new ArrayList<>(beans.values());
AnnotationAwareOrderComparator.sort(factories);
this.eventListenerFactories = factories;
}
DefaultListableBeanFactory of clearMetadataCache metadata cache cleared
Mainly to determine whether has been created, if not created BeanDefinition
in stale=true
, created not deal with. Finally allBeanNamesByType
and singletonBeanNamesByType
cache cleared.
@Override
public void clearMetadataCache() {
super.clearMetadataCache();
clearByTypeCache();
}
public void clearMetadataCache() {
this.mergedBeanDefinitions.forEach((beanName, bd) -> {
if (!isBeanEligibleForMetadataCaching(beanName)) {
bd.stale = true;
}
});
}
private void clearByTypeCache() {
this.allBeanNamesByType.clear();
this.singletonBeanNamesByType.clear();
}
AbstractApplicationContext的invokeBeanFactoryPostProcessors
Finally, it is determined whether or not to join LoadTimeWeaverAwareProcessor
processor, this being unimportant.
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
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()));
}
}
to sum up
So far call BeanFactory
postprocessor completed, the next we summarize remove custom processors, mainly ConfigurationClassPostProcessor
in the processing, parsing configuration class, loads bean
define, configure classes may be CGLIB
dynamic enhancement agent, and finally the rest of the BeanFactoryPostProcessor
process finishes processing:
back will be carried out BeanPostProcessor
post-processor register it, this is used to participate in bean
the process of creating friends.
registerBeanPostProcessors registration bean post-processors
In fact, the inside with invokeBeanFactoryPostProcessors
almost all have priority treatment, and then will be sorted registered, the last is this:
Well, here today, we hope to help study and understand, do not spray the Great God see, understand only their own learning, limited capacity, please excuse.