孙哥Spring源码第17集

第17集 refresh()-invokeBeanFactoryPostProcessor -一-invokeBeanFactoryPostProcessor的分析过程

【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
孙哥Spring源码第17集_第1张图片

1、什么是解析顶级注解?

@PropertySource

@CompeontScan

  • @Configuration

  • @Component

@ImportResource

不是创建对象,涉及到这些类型对象的创建 会交给 DefaultListableBeanFactory创建。
根据上述注解进行Bean的注册,生成BeanDefinition 注册到 DefaultListableBeanFactory的 beanDefinitionMap中。

2、invokeBeanFactoryPostProcessor的分析过程

A: 创建集合
B: 只会处理手动添加的而非注解添加的
C: BeanDefinitionRegistryPostProcessor
D: 默认运行ConfigurationClassPostProcessor对顶级注解的解析
D-E: 开始解析

孙哥Spring源码第17集_第2张图片

3、FullConfiguration和LiteConfiguration的区别

区别一:从类型角度进行区分

  • FullConfiguration
    • @Configuration
  • LiteConfiguration
    • @Component
    • @CompeontScan
    • @ImportResource

区别二:从优缺点上进行区别

Spring 框架区分 FullConfigurationLiteConfiguration 主要是为了提供不同的配置方式和功能,以满足在各种应用场景中对于特性和性能的需求。下面我们将详细解释这两个配置类型的区别:

1. FullConfiguration (完全模式)

  • 使用 @Configuration 注解的 Java 类定义。
  • Spring 容器会通过 CGLIB 代理提高 Bean 的创建过程。
  • 支持定义有状态的 Bean 单例(有状态的单例在多线程环境下需要注意)。
  • 优点:支持更复杂的依赖注入与管理。
  • 缺点:在大型项目中可能导致启动时间较长及资源占用较多。

2. LiteConfiguration (轻量模式)

  • 不使用 @Configuration 注解,而直接使用普通类定义。
  • Spring 容器不会使用 CGLIB 对这些类进行代理。
  • 通常用于简单的配置场景,如第三方库的内置自动配置等。
  • 推荐使用无状态的 Bean 单例,避免潜在的多线程问题。
  • 优点:启动速度较快,资源占用较少,更适合大型项目或微服务架构。
  • 缺点:相较于 FullConfiguration,功能稍有限制,不支持某些高级功能。

总之,根据项目需求和团队习惯,可以灵活选择适合的配置方式。FullConfiguration 提供强大、深度的定制能力,适用于复杂的系统;而 LiteConfiguration 更轻量、快速,适用于简单或大型项目中。

注意:

App的@Configuration是在xxxApplicationContext构建方法的register()中注册的,它是全局的起点,后续ConfigurationClassPostProcessor都是为了处理App的@Configuration

孙哥Spring源码第17集_第3张图片

4、总结

  • 调用 BeanFactoryPostProcceor、BeanDefinitionRegistryPostProcessor
  • 默认情况下处理的就是ConfigurationClassPostProcessor 、
    • 作用:
      处理解析 顶级注解
      @Configruation
      @PropertySource
      @ Componet( @Service @Repository @Controller)
      @ Import (普通类 ImportSeletor ImporBeanDefinitionRegitory)
      @ComponentScan

你可能感兴趣的:(spring,java,后端)