Primavera 5.x viaje Fuente doce invokeBeanFactoryPostProcessors cuatro
La aplicación de la post-procesador restante BeanFactoryPostProcessor
Primero prensa PriorityOrdered
, Ordered
y generalmente BeanFactoryPostProcessor
no procesada en tres conjuntos de procesadores, y tratarse por separado en secuencia, excepto que nuestra costumbre que, está dentro EventListenerMethodProcessor
de.
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
De bean
nombre de encontrar y crear EventListenerFactory
el tipo de objeto devuelto, a continuación, guardar en eventListenerFactories
el hecho de que la planta es para crear un detector de eventos, puede crear un detector de eventos más adelante.
@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 de caché de metadatos clearMetadataCache despejado
Principalmente para determinar si se ha creado, si no se ha creado BeanDefinition
en stale=true
, creada no tratar. Por último allBeanNamesByType
y singletonBeanNamesByType
caché despejado.
@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();
}
invokeBeanFactoryPostProcessors AbstractApplicationContext 的
Por último, se determina si unirse o no a LoadTimeWeaverAwareProcessor
procesador, este ser poco importante.
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()));
}
}
resumen
Hasta ahora llamada BeanFactory
post-procesador completado, el siguiente resumimos quitamos procesadores personalizados, principalmente ConfigurationClassPostProcessor
en el procesamiento, análisis de clase de configuración, cargas bean
definen, configure las clases pueden ser CGLIB
agente de mejora dinámica, y finalmente el resto del BeanFactoryPostProcessor
proceso de termina de procesar:
de nuevo se llevará a cabo BeanPostProcessor
post-procesador de registro, esto se utiliza para participar en bean
el proceso de creación de amigos.
registerBeanPostProcessors frijol registro post-procesadores
De hecho, el interior con invokeBeanFactoryPostProcessors
los objetos se ordenan registrado casi todos tienen un tratamiento prioritario, y luego, la última es la siguiente:
Pues bien, hoy aquí, esperamos estudio ayuda y entender, no rocíe el Gran Dios ver, comprender solamente su propio aprendizaje, capacidad limitada, por favor excusa.