春5.xのソース旅12 invokeBeanFactoryPostProcessors 4
残りのポストプロセッサの実装BeanFactoryPostProcessor
初回PriorityOrdered
、Ordered
一般的にBeanFactoryPostProcessor
プロセッサの3つのセットに処理されていない、と順番に別々に処理、内部にある、私たちのカスタムことを除いてEventListenerMethodProcessor
の。
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
以下からのbean
検索名と作成EventListenerFactory
返されるオブジェクトの種類、その後に保存しeventListenerFactories
た植物は、イベントリスナーを作成することであるという事実は、後でイベントリスナーを作成することができます。
@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;
}
clearMetadataCacheのメタデータキャッシュのクリアDefaultListableBeanFactory
主に作成されていない場合、作成されているかどうかを判断するBeanDefinition
にはstale=true
、対処しませ作成しました。最後にallBeanNamesByType
してsingletonBeanNamesByType
キャッシュをクリア。
@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
最後に、参加するか否かが判定されるLoadTimeWeaverAwareProcessor
プロセッサ、このビーイングの重要でないが。
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()));
}
}
概要
これまでのところ、コールBeanFactory
後処理が完了し、私たちは主に、カスタムプロセッサを削除要約次のConfigurationClassPostProcessor
コンフィギュレーションクラスを解析し、処理には、負荷はbean
、定義の構成クラスであってもよいCGLIB
ダイナミック増強剤、そして最後に、残りのBeanFactoryPostProcessor
プロセス処理を終了:
バックが行われるBeanPostProcessor
ポストプロセッサは、それを登録し、これはに参加するために使用されているbean
友人を作成するプロセス。
registerBeanPostProcessors登録ビーンポストプロセッサ
実際には、との内部のinvokeBeanFactoryPostProcessors
ほぼすべての優先処理を持ち、その後、登録ソートされますが、最後はこれです:
さて、今日ここに、私たちは自分自身の学習、限られた容量を理解し、偉大な神は見スプレーしないで、言い訳してください、助けの調査に希望と理解しています。