孙哥Spring源码第21集

news2024/11/19 13:40:08

第21集 refresh-invokeBeanFactoryPostProcessor-下半部分BeanFactoryPostPrcessor处理

【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】

1、注解处理添加的的BeanDefinitionRegistryFactoryProcessor在哪个地方?

在第一个invokeBeanDefinitionRegistryPostProcessors中处理ConfiguraitonClassPostProcessor

2、beanFactory.getBeanNamesForType获取到的有什么BeanPostProcessor?

image-20230513235826710 image-20230514222441444

3、为什么add加入BeanFactoryPostProcessor没有注册?

image-20230514010905636

因为new了没有注册,正常情况下应该是自己把添加的BeanDefinitionRegistryPostProcessor给注册了,这样才合乎情理。

4、Spring的设计缺点

因为new了没有注册,正常情况下应该是自己把添加的BeanDefinitionRegistryPostProcessor给注册了也就是添加到BeanDefinitionMap,这样才合乎情理。

5、整个下方其实的处理逻辑是什么?

因为,在上方处理的时候 会把@Component的BeanFactoryPostProcessor进行注册,上方的处理逻辑只会处理BeanDefinitionRegistryPostProcessor的父接口【postProcessBeanFactory】和子接口【postProcessBeanDefinitionRegistry】,下方的只会处理注解添加的BeanFactoryPostProcessor【postProcessBeanFactory】以及自带的EventListenerProcessor【postProcessBeanFactory】

6、总结第21集

  • refresh的invokeBeanFactoryPostProcessor方法从两个角度处理BeanFactoryPostProcessor以及BeanDefinitionRegistryPostPrcessor,
    • 第一个角度就是 Spring自带的CofigurationClassPostProcessor【BeanDefinitionRegistryPostPrcessor 】还有就是EventListenerProcessor【BeanFactoryProcessor】
    • 第二个角度就是 程序猿自己通过手工或者注解【@Component @Configuration】方式添加的BeanFactoryPostProcessor还有BeanDefinitionRegistryPostPrcessor
  • refresh的invokeBeanFactoryPostProcessor方法,刚开始先经历一个for循环处理手工添加的,如果你手工添加的有BeanDefinitionRegistryPostPrcessor A 那么 A和CofigurationClassPostProcessor会在第一次InvokeBeanDefinitionRegistryPostProcessors进行处理,然后会在以相同的逻辑后面处理EventListenerProcessor【BeanFactoryProcessor】
  • 请注意手动add的BeanFactoryProcessor和BeanDefinitionRegistryPostPrcessor 是不会注册成BeanDefinition。

7、从第17集-21集的总结

refresh的invokeBeanFactoryPostProcessor方法的作用:其实就是调用postProcessBeanDefinitionRegistry的 processConfigBeanDefinitions完成了我们开发过程中所涉及到的应用不同的形式和应用不同的注解,最后BeanDefinition注册完成的工作。
6.1:、正常情况下,分为上下两个处理过程,如果我们不手动添加,上半部分只会处理CofigurationClassPostProcessor【BeanDefinitionRegistryPostPrcessor 】 CofigurationClassPostProcessor处理顶级注解,这个还分为两个类型一个FullConfiguration还有一个LiteConfiguration以及一个不属于任何的@PropertySource

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

1. FullConfiguration (完全模式)

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

2. LiteConfiguration (轻量模式)

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

总之,根据项目需求和团队习惯,可以灵活选择适合的配置方式。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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1001128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flutter】引入网络图片时,提示:Failed host lookup: ‘[图片host]‘

在使用 NetworkImage 组件加载外部图片时,提示 Failed host lookup: [图片host] 错误。 排查方向 1、清理缓存 解决方案: 尝试flutter clean清空缓存后重新安装依赖flutter pub get重新构建项目flutter create . 走完上述三个步骤后,再次…

COMO-ViT论文阅读笔记

Low-Light Image Enhancement with Illumination-Aware Gamma Correction and Complete Image Modelling Network 这是一篇美团、旷视、深先院、华为诺亚方舟实验室、中国电子科技大学 五个单位合作的ICCV2023的暗图增强论文,不过没有开源代码。 文章的贡献点一个是…

工作游戏时mfc140u.dll丢失的解决方法,哪个方法可快速修复mfc140u.dll问题

在 Windows 操作系统中,mfc140u.dll 文件是非常重要的一个组件,许多基于 MFC(Microsoft Foundation Classes)的程序都需要依赖这个文件。然而,有些用户在运行这些程序时可能会遇到mfc140u.dll丢失的问题,导…

技术分析需谨慎,各位投资者应该这样做

技术市场分析中存在许多工具,其中之一便是烛台模式。然而对于这些模式和指标,FPmarkets澳福和各位投资者应持谨慎的态度,因为它们仅仅展示了一种可能的结果,而无法确保其绝对准确。 关于蜡烛图交易的提示,包括Maruboz…

RK3399平台开发系列讲解(内核调试篇)spidev_test工具使用

🚀返回专栏总目录 文章目录 一、环境二、执行测试三、回环测试四、字节发送测试五、32位数据发送测试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上,“spidev_test” 是一个用于测试和配置 SPI(Serial Peripheral Interface)设备的命令行工具。…

2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐✅

一、前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 毕业设计选题非常重要&a…

页面优化技术

页面优化技术 文章目录 页面优化技术1.概述2.页面缓存URL缓存对象缓存2.1 页面缓存2.2 对象缓存2.3 测试效果 3.页面静态化 1.概述 Aim:减少对数据库的访问 页面缓存URL缓存对象缓存’ Aim:实现前后端分离 页面静态化,前后端分离 Aim: 静态资…

华为Mate60 Pro手机重大突破,资本要做空iPhone?Android开发市场将来会如何?

在9月10日有消息称,在华为的Mate60 Pro手机取得重大突破,其研发的 麒麟9000s芯片的研制, 国际卫星通信技术的应用 等这一系列的重大突破,导致美国的一家对冲基金Satori Fund创始人公开要做空iPhone。 而摩根大通发布报告称&#x…

LeetCode(力扣)122. 买卖股票的最佳时机 II

LeetCode122. 买卖股票的最佳时机 II 题目链接代码 题目链接 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 代码 class Solution:def maxProfit(self, prices: List[int]) -> int:result 0for i in range(1, len(prices)):result max((prices[i…

Mybatis 动态语言 - mybatis-velocity

前面我们介绍了Mybatis动态SQL的使用;本篇我们介绍使用mybatis-velocity动态语言生成动态SQL。 如果您对Mybatis动态SQL不太了解,建议您先进行了解后再阅读本篇,可以参考: Mybatis 动态SQL – 使用if,where标签动态生成条件语句…

FFMPEG视频压缩与Python使用方法

一、简介 FFMPEG 是一个完整的,跨平台的解决方案,记录,转换和流音频和视频。 官网:https://ffmpeg.org/ 二、安装 1、Linux: sudo apt install ffmpeg 2、Mac: brew install ffmpeg 3、Windows: 下载文件&#…

web UI自动化介绍

文章目录 一、web UI自动化介绍1.1 执行UI自动化测试前提1.2 Selenium介绍以及知识点梳理 二、Selenium 学习2.1 基础2.1.1 环境安装与基础使用2.1.2 web浏览器控制2.1.3 常见控件的八大定位方式2.1.3.1 八大定位方式介绍2.1.3.2 NAME、ID定位2.1.3.3 css_selector定位2.1.3.4 …

第六章 图 六、最小生成树(Prim算法、Kruskal算法)

一、定义 对于一个带权连通无向图G(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T称为G的最小生成树(Minimum-Spanning-Tree, MST)。 二、手…

PCD235A101-3BHE032025R010 为航海级用户提供卓越的性能

PCD235A101-3BHE032025R010 为航海级用户提供卓越的性能 PCD235A101 系列提供 12.1 英寸、19 英寸和 24 英寸 LCD 尺寸,配备宽视角屏幕,以满足不同船舶的要求。船用PC符合DNV标准,通过IEC 60945认证,具有日光/月光可读、防腐涂层…

C语言入门Day_18 判断和循坏的小结

目录 前言: 1.判断 2.循环 3.课堂笔记 4.思维导图 前言: 判断语句和循环语句都可以大致分为三个部分,第一个部分是固定的语法格式;第二部分是代码的执行顺序,第三部分是判断和循环成立与否的判断条件。 1.判断 1…

小米13Pro/13Ultra刷面具ROOT后激活LSPosed框架微X模块详细教程

喜欢买小米手机,很多是因为小米手机的开放,支持root权限,而ROOT对普通用户来说更多的是刷入DIY模块功能,今天ROM乐园小编就教大家如何使用面具ROOT,实现大家日常情况下非常依赖的微X模块功能,体验微X模块的…

10.2 整流电路

在分析整流电路时,为了突出重点,简化分析过程,一般均假定负载为纯电阻性;整流二极管为理想二极管,即导通时正向压降为零,截止时反向电流为零;变压器无损耗,内部压降为零等。 一、整…

信息化发展35

IT审计技术-风险评估技术 常用的IT 审计技术包括风险评估技术、审计抽样技术、计算机辅助审计技术及大数据审计技术。 IT 风险评估技术一般包括: 1 )风险识别技术: 用以识别可能影响一个或多个目标的不确定性, 包括德…

W11下CMake MinGW配置OpenCV和Qt

💂 个人主页:风间琉璃🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 前言 前几天将cuda版本的opencv给编译成功了,当时用的VS的MSVC&…

初阶扫雷(超详解)

✨博客主页:小钱编程成长记 🎈博客专栏:C语言小游戏 🎈推荐相关博文:初阶三子棋(超详解) 初阶扫雷 1.游戏介绍2.基本思路3.实现前的准备4.实现步骤4.1 打印菜单4.2 初始化扫雷棋盘4.3 打印扫雷棋…