第17集 refresh()-invokeBeanFactoryPostProcessor -一-invokeBeanFactoryPostProcessor的分析过程
【视频来源于:B站up主孙帅suns Spring源码视频】
1、什么是解析顶级注解?
@PropertySource
@CompeontScan
-
@Configuration
-
@Component
@ImportResource
不是创建对象,涉及到这些类型对象的创建 会交给 DefaultListableBeanFactory创建。
根据上述注解进行Bean的注册,生成BeanDefinition 注册到 DefaultListableBeanFactory的 beanDefinitionMap中。
2、invokeBeanFactoryPostProcessor的分析过程
A: 创建集合
B: 只会处理手动添加的而非注解添加的
C: BeanDefinitionRegistryPostProcessor
D: 默认运行ConfigurationClassPostProcessor对顶级注解的解析
D-E: 开始解析
3、FullConfiguration和LiteConfiguration的区别
区别一:从类型角度进行区分
- FullConfiguration
- @Configuration
- LiteConfiguration
- @Component
- @CompeontScan
- @ImportResource
区别二:从优缺点上进行区别
Spring 框架区分 FullConfiguration
和 LiteConfiguration
主要是为了提供不同的配置方式和功能,以满足在各种应用场景中对于特性和性能的需求。下面我们将详细解释这两个配置类型的区别:
1. FullConfiguration (完全模式)
- 使用
@Configuration
注解的 Java 类定义。 - Spring 容器会通过 CGLIB 代理提高 Bean 的创建过程。
- 支持定义有状态的 Bean 单例(有状态的单例在多线程环境下需要注意)。
- 优点:支持更复杂的依赖注入与管理。
- 缺点:在大型项目中可能导致启动时间较长及资源占用较多。
2. LiteConfiguration (轻量模式)
- 不使用
@Configuration
注解,而直接使用普通类定义。 - Spring 容器不会使用 CGLIB 对这些类进行代理。
- 通常用于简单的配置场景,如第三方库的内置自动配置等。
- 推荐使用无状态的 Bean 单例,避免潜在的多线程问题。
- 优点:启动速度较快,资源占用较少,更适合大型项目或微服务架构。
- 缺点:相较于 FullConfiguration,功能稍有限制,不支持某些高级功能。
总之,根据项目需求和团队习惯,可以灵活选择适合的配置方式。FullConfiguration 提供强大、深度的定制能力,适用于复杂的系统;而 LiteConfiguration 更轻量、快速,适用于简单或大型项目中。
注意:
App的@Configuration是在xxxApplicationContext构建方法的register()中注册的,它是全局的起点,后续ConfigurationClassPostProcessor都是为了处理App的@Configuration
4、总结
- 调用 BeanFactoryPostProcceor、BeanDefinitionRegistryPostProcessor
- 默认情况下处理的就是ConfigurationClassPostProcessor 、
- 作用:
处理解析 顶级注解
@Configruation
@PropertySource
@ Componet( @Service @Repository @Controller)
@ Import (普通类 ImportSeletor ImporBeanDefinitionRegitory)
@ComponentScan
- 作用: