spring ConfigurationClassPostProcessor执行流程(子类后置处理器)
2025-11-24 13:55:56 0 举报
`ConfigurationClassPostProcessor` 是 Spring 框架中的一个关键类,它作为 `BeanFactoryPostProcessor` 的实现,负责在 Spring 容器的标准初始化之后,但在任何 `Bean` 实例化之前执行。这个过程涉及解析 `@Configuration` 注解的类,收集和注册由这些配置类指定的 bean 定义。
作者其他创作
大纲/内容
有
获取自定义的名字生成器:generator获取环境变量:environment
找出当前所有的候选配置类List<BeanDefinitionHolder> configCandidates
准备解析,判断是否已解析过processConfigurationClass()
判断是否有父类?有则当作配置类处理
处理当前配置类上的@Import注解
开始解析配置类parser.parse(candidates)
配置类
结束
是
设置扫描包名列表:basePackages
ClassPathBeanDefinitionScanner类
普通类
执行实现ImportBeanDefinitionRegistrar接口的回调方法registerBeanDefinitions()
标记是全配置类还是半配置类
添加自定义的过滤器:includeFilters、excludeFilters
排除:内置的子类(BeanFactoryPostProcessor,BeanPostProcessor,AopInfrastructureBean,EventListenerFactory)
将配置类上的@Bean方法加到beanMethodsaddBeanMethod()
@Import的类中又有@Import或者ImportSelector中导入多个类并且没有实现该接口,则走否这条流程,当做配置类重新解析
遍历所有的内部类,如果是半配置类则加到候选配置类,然后递归调用
ConfigurationClassBeanDefinitionReader类
是否被Import?
加载配置类到beanDefinitionReaderreader.loadBeanDefinitions(configClasses)
@Component或@ManagedBean或@Named以及自定义的Filter
添加默认的excludeFilterscanner.addExcludeFilter()
遍历basePackages进行扫描
对候选配置类进行排序:configCandidates.sort
遍历所有的candidates开始解析parser.parse(candidates)
可能导入配置类或普通类
处理配置类上的导入xml配置文件@ImportResourceaddImportedResource()
设置当前配置类是不是懒加载scanner.setLazyInit()
遍历配置类集合for(){loadBeanDefinitionsForConfigurationClass()}
实现接口ImportSelector.class?
否
importedBy不为空
解析当前配置类@Import的所有类processImports()
实例化配置类解析器parser = new ConfigurationClassParser()创建注解扫描器componentScanParser = new ComponentScanAnnotationParser()
当注解不为@Import时,则递归注解的注解,防止自定义注解里面有@Import
有@Component则处理配置类的内部成员processMemberClasses()
默认添加3个过滤器到includeFilters:@Component/@ManagedBean/@Named
用于排除当前配置类,即解析的时候跳过自己
ConfigurationClassPostProcessor类后置处理器processConfigBeanDefinition()
处理配置类上的扫描器注解@ComponentScancomponentScanParser.parse
判断是否是接口/抽象isCandidateComponent
将新增的配置类打上全配置类还是半配置类的标记
将接口上的@Bean方法加到beanMethods递归遍历所有接口processInterfaces()
配置扫描器的名字生成策略器scanner.setBeanNameGenerator()
ConfigurationClassParser类
通过递归获取当前配置类上的所有@Import类getImports(sourceClass)
将扫描的配置类打上全配置类还是半配置类的标记
开始解析并填充configClassdoProcessConfigurationClass()
实例化扫描器2scanner=new ClassPathBeanDefinitionScanner()
回调方法导入的是普通类?配置类且没解析过?
处理配置类上的配置注解@PropertySourceprocessPropertySource()
实现接口ImportBeanDefinitionRegistrar.class?
通过ASM技术解析文件成元数据:MetadataReader
执行过滤器判断是否符合规则isCandidateComponent
将@Bean方法的beanMethods放进beanDefinitionMap中
将candidates添加到beanDefinitionMap中
通过接口ImportBeanDefinitionRegistrar进行导入的配置类是如果是配置类则需要重新解析,如果是普通类则无需解析
扫描出来的是配置类,则对该类进行解析
加到候选bean列表candidates.add()
创建扫描器,用于加载所有的配置类da到beanDefinitionMap中reader =new ConfigurationClassBeanDefinitionReader
扫描出的配置类?
有什么区别?有什么作用?
添加到importBeanDefinitionRegistrars
判断是否需要跳过BD?
可能会往beanDefinitionMap中注入新的bean
添加自定义的过滤器:includeFilters、excludeFiltersincludeFilters:默认3个excludeFilters:默认1个
配置扫描的文件匹配规则默认:\"**/*.class\"
否当成配置类递归解析
ComponentScanAnnotationParser类
是递归解析
重新遍历所有的BeanDefinitionMap中的BD
获取classpath+package下的所有文件
将该配置类放进beanDefinitionMap中
将xml配置的bean放进beanDefinitionMap中
开始扫描scanner.doScan()
实现这两个接口的类不是bean,不会放进单例池中
0 条评论
下一页