孙哥Spring源码第17集

第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.mzph.cn/news/67776.shtml

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

相关文章

Java 【dubbo rpc改feign调用】feign接口调用 Body parameter 4 was null

dubbo rpc改feign调用,feign调用接口异常统一处理 优化方案 【框架改造问题点记录,dubbo改为spring cloud alibaba】 【第四篇】feign接口调用 Body parameter 4 was null 【描述】Feign是一个声明式的Web服务客户端,它使得写HTTP客户端变得更…

垃圾回收 - 复制算法

GC复制算法是Marvin L.Minsky在1963年研究出来的算法。说简单点,就是只把某个空间的活动对象复制到其它空间,把原空间里的所有对象都回收掉。这是一个大胆的想法。在此,我们将复制活动对象的原空间称为From空间,将粘贴活动对象的新…

深度学习中epoch、batch、step、iteration等神经网络参数是什么意思?

epoch:表示将训练数据集中的所有样本都过一遍(且仅过一遍)的训练过程。在一个epoch中,训练算法会按照设定的顺序将所有样本输入模型进行前向传播、计算损失、反向传播和参数更新。一个epoch通常包含多个step。 batch:…

Spring工具类--CollectionUtils的使用

原文网址:Spring工具类--CollectionUtils的使用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring的CollectionUtils的使用。 CollectionUtils工具类的作用:操作Collection,比如:List、Set。 判断 方法作用static boolean is…

VSCode 配置 C 语言编程环境

目录 一、下载 mingw64 二、配置环境变量 三、三个配置文件 四、格式化代码 1、安装插件 2、保存时自动格式化 3、左 { 不换行 上了两年大学,都还没花心思去搭建 C 语言编程环境,惭愧,惭愧。 一、下载 mingw64 mingw64 是著名的 C/C…

Vcenter 解决vlcs无法删除和创建的问题-vcls存储有问题

一、我有一篇博客;Vcenter解决vcls虚拟机故障问题_A ?Charis的博客-CSDN博客 这是一个办法,但不是万能的,如果有vcls的存储无法访问,那么不会重新创建。 二、此时有一个解决办法 #此方案需要前置完成Vcenter高级设置-co…

本地缓存Caffeine的缓存过期淘汰策略

本地缓存是一种将数据存储在应用程序的内存中,以加速数据访问的技术。缓存的数据可以是频繁访问的数据,以减少对慢速数据源(如数据库或网络)的访问。缓存通常有一些缓存过期淘汰策略,以确保缓存中的数据保持最新和有效…

python opencv

保存直播流生存逐个图片 import cv2 from threading import Threadclass ThreadedCamera(object):def __init__(self, source 0):self.capture cv2.VideoCapture(source)self.thread Thread(target self.update, args ())self.thread.daemon Trueself.thread.start()sel…

SpringBoot整合WebSocket

流程分析 Websocket客户端与Websocket服务器端 前端浏览器和后端服务器的连接通信 HTTP与Websocket对比 服务器端编码 1.引入pom依赖 <!--webSocket--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-sta…

【内网穿透】使用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(九)mysql主从复制

目录 前言概述提出问题主从复制的用途工作流程 主从复制的配置创建复制账号配置主库和从库启动主从复制从另一个服务器开始主从复制主从复制时推荐的配置sync_binloginnodb_flush_logs_at_trx_commitinnodb_support_xa1innodb_safe_binlog 主从复制的原理基于语句复制优点&…

视频监控/视频汇聚/视频云存储EasyCVR平台接入国标GB协议后出现断流情况,该如何解决?

视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。安防监控平台EasyCVR既具备传统安防视频监控的能…

Docker基础教程

Docker基础教程 Docker简介 Docker基本操作 Docker应用 Docker自定义镜像 Docker compose 为什么使用DockerDocker简介安装DockerDocker的中央仓库Docker镜像操作Docker容器操作准备一个web项目创建MySQL容器创建Tomcat容器将项目部署到TomcatDocker数据卷DockerfileDock…

An Empirical Study of GPT-3 for Few-Shot Knowledge-Based VQA

本文是LLM系列文章&#xff0c;针对《An Empirical Study of GPT-3 for Few-Shot Knowledge-Based VQA》的翻译。 GPT-3对基于小样本知识的VQA的实证研究 摘要引言相关工作方法OK-VQA上的实验VQAv2上的实验结论 摘要 基于知识的视觉问答&#xff08;VQA&#xff09;涉及回答需…

Lombok讲解

Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具&#xff0c;如&#xff1a;getter、setter、equals、hashCode、toString等。 Lombok的常用注解有&#xff1a; Data&#xff1a;这是一个自定义注解&#xff0c;它相当于Getter…

LeetCode 热题 100——无重复字符的最长子串(滑动窗口)

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 从s字符串中&#xff0c;去找出连续的子串&#xff0c;使该子串中没有重复字符&#xff0c;返回它的最长长度。 暴力枚举 依次以第一个、第二个、第三个等等为起点去遍历字符串&a…

华为数通方向HCIP-DataCom H12-821题库(单选题:261-280)

第261题 以下关于IPv6过渡技术的描述,正确的是哪些项? A、转换技术的原理是将IPv6的头部改写成IPv4的头部,或者将IPv4的头部改写成IPv6的头部 B、使用隧道技术,能够将IPv4封装在IPv6隧道中实现互通,但是隧道的端点需要支持双栈技术 C、转换技术适用于纯IPv4网络与纯IPv…

SegNeXt学习记录(一):配置环境 测试代码

安装配置MMSegmentation环境 为了验证 MMSegmentation 和所需的环境是否安装正确&#xff0c;我们可以运行示例 python 代码来初始化分段器并推断演示图像&#xff1a; from mmseg.apis import inference_segmentor, init_segmentor import mmcvconfig_file configs/pspnet/…

能力和结果之间的关系

大家好,这里是大话硬件。 今天这篇文章想和大家分享前段时间的一点工作体会,关于个人能力和工作结果之间的关系。 其实这些感悟是在上周三晚上下班,走在回家的路上,脑海中突然出现这样的体会,回到家里立马写了下来。因为是即时的灵感,完全是因为工作状态触发,立刻写下…

win11 pip.ini

windows pip.ini 文件管理器文件路径地址栏敲&#xff1a;%APPDATA% 回车&#xff0c;快速进入 C:\Users\电脑用户\AppData\Roaming 文件夹中 新建 pip 文件夹并在文件夹中新建 pip.ini 配置文件 新增 pip.ini 配置文件内容 然后在pip.ini中填写&#xff1a; [global] ind…