孙哥Spring源码第17集

news2024/10/6 5:59:44

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

【视频来源于:B站up主孙帅suns Spring源码视频】
image-20230511225052027

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

@PropertySource

@CompeontScan

  • @Configuration

  • @Component

@ImportResource

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

2、invokeBeanFactoryPostProcessor的分析过程

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

image-20230511230851670

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

image-20230514014033687

4、总结

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

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

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

相关文章

第14章 热门数据实时收集

mini商城第14章 热门数据实时收集 一、课题 商品秒杀-热门数据实时收集 二、回顾 1、秒杀设计 2、活动管理 3、搜索管理 4、商品详情处理 5、 数据同步 三、目标 1、掌握热门分析收集方案 2、Lua高级语法 掌握Lua高级语法指令执行顺序 掌握Lua高级语法指令编写位置 …

FPGA GTH 全网最细讲解,aurora 8b/10b编解码,HDMI视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTH 全网最细解读GTH 基本结构GTH 发送和接收处理流程GTH 的参考时钟GTH 发送接口GTH 接收接口GTH IP核调用和使用 4、设计思路框架视频源选择silicon9011解码芯片配置及采集动态彩条视频数据组包GTH aurora 8b/10…

el-select 加多选框使用

解决方法&#xff1a; el-select 添加属性 multiple&#xff0c; <el-form-item label"订单来源&#xff1a;"><el-selectv-model"tableFrom.userType"clearablemultipleplaceholder"请选择"class"selWidth"><el-opt…

Android图形-架构1

目录 引言 Android图形的关键组件&#xff1a; Android图形的pipeline数据流 BufferQueue是啥&#xff1f; 引言 Android提供用于2D和3D图形渲染的API&#xff0c;可与制造商的驱动程序实现代码交互&#xff0c;下面梳理一下Android图形的运作原理。 应用开发者通过三种方…

pm2 运行springboot项目

创建springboot项目打包 注意安装java版本必须和打包的java版本一致 java安装 安装pm2 安装nodejs 通过npm安装pm2 配置json pm2.json {"name": "test01","script": "D:\\jdk-17.0.6\\bin\\java.exe","args": ["-D…

无涯教程-JavaScript - EDATE函数

描述 EDATE函数返回表示日期的序列号,该序列号是在指定日期(start_date)之前或之后的月份数。 使用EDATE来计算到期日或到期日,该到期日或到期日与发行日期在当月的同一天。 语法 EDATE (start_date, months)争论 Argument描述Required/OptionalStart_date 代表开始日期的…

2023年特色小镇行业研究报告

第一章 行业概况 1.1 定义 特色小镇&#xff0c;是指以特定产业、文化、旅游、历史等特色为依托&#xff0c;以小镇为载体&#xff0c;通过优化提升小镇的综合功能和服务能力&#xff0c;形成独特的区域品牌和产业集群&#xff0c;进而推动区域经济社会发展的一种新型城镇化形…

【Unity编辑器扩展】| 顶部菜单栏扩展 MenuItem

前言【Unity编辑器扩展】 | 顶部菜单栏扩展 MenuItem一、创建多级菜单二、创建可使用快捷键的菜单项三、调节菜单显示顺序和可选择性四、创建可被勾选的菜单项五、右键菜单扩展5.1 Hierarchy 右键菜单5.2 Project 右键菜单5.3 Inspector 组件右键菜单六、AddComponentMenu 特性…

AUTOSAR简介及分层架构

这里写目录标题 1、AUTOSAR简介2、AUTOSAR的分层架构2.1、应用软件层(ASW)2.2、运行时环境(RTE)2.3、基础软件层(BSW)2.4、微控制器-MCAL层 1、AUTOSAR简介 AUTOSAR&#xff08;AUTomotive Open System ARchitecture&#xff09;是一种为汽车软件开发提供开放化、标准化、可重…

一篇文章教会你SpringMVC

目录 1.什么是SpringMVC 2.SpringMVC工作流程 3.SpringMVC核心组件 4.SpringMVC的配置流程 4.1导入POM依赖 4.2在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml) 4.3 修改web.xml 创建一个Controller用来存放web层的方法和内容 创建一个前端页面用来做测试展示 前言…

一种影像比对快速提取建筑物要素变化的方法

李和军1,2 李 敏3 李楚钰1,2 唐廷元1,2 胡日查4 (1. 北京市测绘设计研究院, 北京, 100038;2. 城市空间信息工程北京市重点实验室, 北京 100038;3. 北京市地质矿产勘查院信息中心, 北京, 100195;4. 内蒙古测绘地理信息中心, 内蒙古 呼和浩特, 010000) 摘 要&#xff1a;本文围绕…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(4)一些优化总结

前言 上一次说到单相的PFC硬件功能已经实现&#xff0c;THD3.15%满足了国标要求的范围&#xff0c;还是有优化的空间&#xff0c;目前系统设计的是6.6Kw&#xff0c;220V交流输出&#xff0c;400-800V直流输出。目前基本功能完成&#xff0c;但是还有很多细节需要优化&#xf…

飞行动力学 - 第16节-part2-放宽静稳定性 之 基础点摘要

飞行动力学 - 第16节-part2-放宽静稳定性 之 基础点摘要 1. 放宽静稳定性(RSS, Relax Static Stability )2. 纵向增稳器3. 阻力损失4. 参考资料 1. 放宽静稳定性(RSS, Relax Static Stability ) - 稳定飞机&#xff1a;为保证稳定&#xff0c;需要一个抬头力矩&#xff0c;平尾…

软件产品测试报告有哪些测试内容

软件测试内容 随着软硬件技术的发展&#xff0c;计算机领域的应用越来越广泛&#xff0c;软件的功能越来越强大&#xff0c;软件也越来越复杂。计算机软件是计算机应用的核心&#xff0c;其质量与计算机应用系统的成败有关&#xff0c;这使得确保软件的质量和高度可靠性尤为重…

Webpack5入门到原理

Webpack5学习 尚硅谷Webpack5新版视频教程 B站直达&#xff1a;https://www.bilibili.com/video/BV14T4y1z7sw 百度网盘&#xff1a;https://pan.baidu.com/s/114lJRGua2uHBdLq_iVLOOQ 提取码&#xff1a;yyds 阿里云盘&#xff1a;https://www.aliyundrive.com/s/UMkmCzdWsGh&…

【内网穿透】使用Nodejs搭建简单的HTTP服务器 ,并实现公网远程访问

目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation…

mysql 查询优化 、索引失效

查询优化 物理查询优化 通过索引和表连接方式等技术来进行优化&#xff0c;这里重点需要掌握索引的使用 逻辑查询优化 通过SQL 等价变换 提升查询效率&#xff0c;直白一点就是说&#xff0c;换一种查询写法执行效率可能更高 索引失效 计算、函数、类型转换&#xff08;自动或…

Springboot 实践(12)RabbitMq server 安装调试(Windows环境)

一、准备安装文件 1、下载Erlang 登录网站Downloads - Erlang/OTP&#xff0c;选择“Download Windows installer”&#xff0c;如下图所示&#xff1a; 弹出框中&#xff0c;选在下载保存地址&#xff0c;保存文件&#xff0c;如下图所示&#xff1a; 2、下载RabbitMQ 登录…

Redis 介绍、安装、Redis客户端

目录 redis是什么&#xff0c;他的应用场景是什么&#xff1f; Redis的一些主要特点和应用场景&#xff1a; redis的官方网站&#xff1a;Redis redis是键值型数据库&#xff1a;&#xff08;也就是key-value模式&#xff09;&#xff08;跟python的字典很像&#xff09; …

利用GitHub实现域名跳转

利用GitHub实现域名跳转 一、注册一个 github账号 你需要注册一个 github账号,最好取一个有意义的名字&#xff0c;比如姓名全拼&#xff0c;昵称全拼&#xff0c;如果被占用&#xff0c;可以加上有意义的数字. 本文中假设用户名为 UNIT-wuji(也是我的博客名) 地址: https:/…