【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
在第一个invokeBeanDefinitionRegistryPostProcessors中处理ConfiguraitonClassPostProcessor
因为new了没有注册,正常情况下应该是自己把添加的BeanDefinitionRegistryPostProcessor给注册了,这样才合乎情理。
因为new了没有注册,正常情况下应该是自己把添加的BeanDefinitionRegistryPostProcessor给注册了也就是添加到BeanDefinitionMap,这样才合乎情理。
因为,在上方处理的时候 会把@Component的BeanFactoryPostProcessor进行注册,上方的处理逻辑只会处理BeanDefinitionRegistryPostProcessor的父接口【postProcessBeanFactory】和子接口【postProcessBeanDefinitionRegistry】,下方的只会处理注解添加的BeanFactoryPostProcessor【postProcessBeanFactory】以及自带的EventListenerProcessor【postProcessBeanFactory】
refresh的invokeBeanFactoryPostProcessor方法的作用:其实就是调用postProcessBeanDefinitionRegistry的 processConfigBeanDefinitions完成了我们开发过程中所涉及到的应用不同的形式和应用不同的注解,最后BeanDefinition注册完成的工作。
6.1:、正常情况下,分为上下两个处理过程,如果我们不手动添加,上半部分只会处理CofigurationClassPostProcessor【BeanDefinitionRegistryPostPrcessor 】 CofigurationClassPostProcessor处理顶级注解,这个还分为两个类型一个FullConfiguration还有一个LiteConfiguration以及一个不属于任何的@PropertySource
1. FullConfiguration (完全模式)
@Configuration
注解的 Java 类定义。2. LiteConfiguration (轻量模式)
@Configuration
注解,而直接使用普通类定义。总之,根据项目需求和团队习惯,可以灵活选择适合的配置方式。FullConfiguration 提供强大、深度的定制能力,适用于复杂的系统;而 LiteConfiguration 更轻量、快速,适用于简单或大型项目中。
接着会继续调用两次invokeBeanFactoryPostProcessors,其实处理的都是BeanDefinitionRegistryPostPrcessor的父类接口,一个是registryProcessors处理@Configuration通过 CGLIB 代理提高 Bean 的创建过程 也就是说非AppConfig中的@Configuration @Bean返回new User保证前后都是一致的 那怕它加了其他注解 @Lazy @Primary @DependOn,regularPostProcessors处理的是手工添加的BeanFactoryProcessor
6.2、下半部分处理的是EventListenerProcessor【BeanFactoryProcessor】,如果你是注解添加的BeanFactoryProcessor也会在这里进行处理的,这里之所以出现这种情况就是上方在处理ConfigurationClassPostPrcessor的时候帮你注册了@Component的BeanFactoryProcessor,而上方只处理BeanDefinitionRegistryPostPrcessor的父子接口。
6.3、请注意手动add的BeanFactoryProcessor和BeanDefinitionRegistryPostPrcessor 是不会注册成BeanDefinition。