SpringBoot自动配置之AutoConfigurationImportFilter
发现自定义的MyConfigurationImportFilter断点match方法多次重复执行
如下图,发现同一个bean(TestApplication)多次参与match

Stack
match:20, MyConfigurationImportFilter (com.example.test) filter:376, AutoConfigurationImportSelector$ConfigurationClassFilter (org.springframework.boot.autoconfigure) shouldExclude:111, AutoConfigurationImportSelector (org.springframework.boot.autoconfigure) test:-1, 635013384 (org.springframework.boot.autoconfigure.AutoConfigurationImportSelector$$Lambda$222) lambda$or$2:101, Predicate (java.util.function) test:-1, 870155470 (java.util.function.Predicate$$Lambda$223) asSourceClass:652, ConfigurationClassParser (org.springframework.context.annotation) asSourceClass:643, ConfigurationClassParser (org.springframework.context.annotation) access$700:111, ConfigurationClassParser (org.springframework.context.annotation) lambda$processGroupImports$1:812, ConfigurationClassParser$DeferredImportSelectorGroupingHandler (org.springframework.context.annotation) accept:-1, 1045568200 (org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler$$Lambda$251) forEach:1257, ArrayList (java.util) processGroupImports:809, ConfigurationClassParser$DeferredImportSelectorGroupingHandler (org.springframework.context.annotation) process:780, ConfigurationClassParser$DeferredImportSelectorHandler (org.springframework.context.annotation) parse:193, ConfigurationClassParser (org.springframework.context.annotation) processConfigBeanDefinitions:331, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:247, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:311, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:112, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:746, AbstractApplicationContext (org.springframework.context.support) refresh:564, AbstractApplicationContext (org.springframework.context.support) refresh:66, ReactiveWebServerApplicationContext (org.springframework.boot.web.reactive.context) refresh:734, SpringApplication (org.springframework.boot) refreshContext:408, SpringApplication (org.springframework.boot) run:308, SpringApplication (org.springframework.boot) run:1306, SpringApplication (org.springframework.boot) run:1295, SpringApplication (org.springframework.boot) main:11, TestApplication (com.example.test) invoke0:-1, NativeMethodAccessorImpl (sun.reflect) invoke:62, NativeMethodAccessorImpl (sun.reflect) invoke:43, DelegatingMethodAccessorImpl (sun.reflect) invoke:498, Method (java.lang.reflect) run:49, RestartLauncher (org.springframework.boot.devtools.restart)
跟踪代码,发现processGroupImports:809, ConfigurationClassParser$DeferredImportSelectorGroupingHandler (org.springframework.context.annotation)
是关键点。这里用了for loop.


这个loop是基于grouping.getImports()的
我们看看其中都有啥?

如上图,基本上都是AutoConfiguration的配置类。
Debug&
通过TestApplication的注解@EnableAutoConfiguration
找到所有@Configuration
通过自定义MyConfigurationImportFilter过滤掉一部分Configuration, 然后 process Import
Reference
(141条消息) SpringBoot自动配置之AutoConfigurationImportFilter_jspang582的博客-CSDN博客