Primavera 5.x Fonte viagem doze invokeBeanFactoryPostProcessors quatro
A implementação do pós-processador restante BeanFactoryPostProcessor
Primeiro imprensa PriorityOrdered
, Ordered
e geralmente BeanFactoryPostProcessor
não processados em três conjuntos de processadores, e transformados separadamente em sequência, exceto que nosso costume 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
Do bean
nome de encontrar e criar EventListenerFactory
o tipo de objeto retornado, em seguida, salvar eventListenerFactories
ao fato da planta é criar um ouvinte de evento, você pode criar um ouvinte de evento mais tarde.
@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 cache de metadados clearMetadataCache apuradas
Principalmente para determinar se foi criado, se não for criado BeanDefinition
no stale=true
, criado não lidar com eles. Finalmente allBeanNamesByType
e singletonBeanNamesByType
cache de limpo.
@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 的
Finalmente, determina-se se ou não aderir LoadTimeWeaverAwareProcessor
processador, esse ser sem importância.
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()));
}
}
resumo
Até agora chamada BeanFactory
pós-processador concluída, o próximo resumimos remover processadores personalizados, principalmente ConfigurationClassPostProcessor
no processamento, análise de classe de configuração, cargas bean
definir, aulas configure pode ser CGLIB
agente de realce dinâmico, e, finalmente, o resto do BeanFactoryPostProcessor
processo termina o processamento:
de volta será realizada BeanPostProcessor
pós-processador registrá-lo, isto é usado para participar bean
do processo de criação amigos.
registerBeanPostProcessors feijão registro pós-processadores
Na verdade, o interior com invokeBeanFactoryPostProcessors
quase todos têm tratamento prioritário, e em seguida serão ordenados registrado, o último é o seguinte:
Bem, aqui hoje, esperamos estudo ajuda e entender, não pulverize o Grande Deus ver, compreender apenas a sua própria aprendizagem, capacidade limitada, por favor, desculpe.