Spring的启动流程refresh方法、配置类解析流程@Component、@Configuration、@Import、@Bean
Spring的启动流程概述:
核心方法:
refresh方法,作用就是实例化spring容器中的所有单例。
3步:
- 生成BeanFactory容器(有beanDefinition类信息和bean对象实例)
- 生成BeanDefinition类信息
- 生成bean对象实例
需要知道的知识:
1、先有beanDefinition类信息,再有bean对象。
2、在beanDefinition和bean前后spring有增加拓展点,拓展点统一用PostProcessor封装。所以流程是:
- 生成BeanFactory容器
- beanDefinitionPostProcessor处理、生成BeanDefinition类信息、beanDefinitionPostProcessor处理
- beanPostProcessor处理、生成bean对象实例、beanDefinitionPostProcessor处理
Spring的启动流程具体一点:
1、生成BeanFactory容器。(即ApplicationContex、AnnotationConfigApplicationContex)
- 创建BeanFactory
- 然后往BeanFactory中丢入基础的PostProcessor处理器的BeanDefinition。
核心是生成PostProcessor的BeanDefinition。这里的PostProcessor处理器主要是BeanDefinition和Bean的PostProcessor处理器,如BeanDefinitionRegistryPostProcessor、ConfigurationClassPostProcessor、EventListenerMethodProcessor等,主要涉及beanDefinition注册、autowired自动注入、aware回调、eventListener事件监听有关的。
2、生成BeanDefinition类信息
- 调用上面放入的BeanFactoryPostProcessor处理器的方法,走方法逻辑,从而得到更多的BeanDefinition。
如调用ConfigurationClassPostProcessor这种beanDefinition注册有关的处理器的方法,就会描相应目录下的@component等生成BeanDefinition、解析@Import,@Bean生成BeanDefinition等。
- 生成国际化messageSource、事件发布applicationEventMulticaster的BeanDefinition
3、生成bean对象实例(单例bean)
创建对象过程是:实例化(1-3)、处理属性(5-7)、初始化(8-10)。涉及到之前加入的Bean的PostProcessor的beanBefinition的处理
1.实例化前。InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
2.实例化
3.实例化后。MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()
4.InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
5.自动注入(依赖注入)
6.属性处理。InstantiationAwareBeanPostProcessor.postProcessProperties()。如@autowired
7.回调处理一些类信息。Aware对象
8.初始化前。BeanPostProcessor.postProcessBeforeInitialization()
9.初始化。执行InitializingBean初始化接口
10.初始化后。BeanPostProcessor.postProcessAfterInitialization()。如aop
配置类解析流程
会给个初始@Component(一般是AppConfig.class)到ApplicationContex中作为入口。对@Component的处理逻辑如下:
1、@Component的bean就会生成beanDefinition上交spring容器,(含@Controller、@Service、@repository、@configuration,这些都是@Component),如果里面有内部类也有@Component,则递归。
2、如果有@ComponentScan,则扫描获取@Component,并生成beanDefinition上交spring容器
3、如果有@Import、@Bean等都生成beanDefinition上交spring容器
@Import、@Configuration、@Bean区别:
1、@Configuration是@Component,自己项目的spring都读取到。@Import和@Bean不是@Component,所以自己项目的spring读取不到,所以需和@Configuration一起用,这样spring就能读到@Component,进而读到@Import和@Bean,走@Import和@Bean的逻辑。
2、当然@Import和@Bean也可以和@Component一起用,但是@Configuration本身就是@Component,用@Configuration有一种标识作用,让人一看就知道这是个导入外部类的配置类,就和@Controller一样,让人一看就知道这个是controller层。
3、@Import(UserConfig.class)和@Bean都是导入外部bean,@Import侧重于导入一个配置类(这个配置类一般是个大入口,里有多个bean,多个bean会注册到spring中),@Import打在类上,@Bean侧重于导入单个bean,@Bean打在方法上。
相关文章:
Spring的启动流程refresh方法、配置类解析流程@Component、@Configuration、@Import、@Bean
Spring的启动流程概述: 核心方法: refresh方法,作用就是实例化spring容器中的所有单例。 3步: 生成BeanFactory容器(有beanDefinition类信息和bean对象实例)生成BeanDefinition类信息生成bean对象实例 需…...

运算放大器(2)
(1)反向放大器 Vout(-R2/R1)*Vi 图一运放的同向端接地0V,反向端和同向端虚短,所以也是0V 反向输入端输入电阻很高,虚断,几乎没有电流注入和流出,那么R1和R2相当于是串联的,流过一个…...

智能优化算法之模拟退火算法SA
发展历史和算法思想 模拟退火算法(Simulated Annealing, SA)是一种基于热力学原理的随机优化算法,最早由 S. Kirkpatrick, C. D. Gelatt 和 M. P. Vecchi 于 1983 年提出。算法的灵感来自于固体物理学中的退火过程:通过加热和缓慢…...

同时用到,网页,java程序,数据库的web小应用
具体实现功能:通过网页传输添加用户的请求,需要通过JDBC来向 MySql 添加一个用户数据 第一步,部署所有需要用到的工具 IDEA(2021.1),Tomcat(9),谷歌浏览器,MySql,jdk(17) 第二步,创建java项目,提前部署数…...

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元
5月30-31日,2024向星力未来数据技术峰会期间,星环科技推出一款创新的语料开发工具——星环语料开发工具TCS(Transwarp Corpus Studio),旨在通过全面的语料生命周期管理,极大提升语料开发效率,助…...

【ARM】MDK安装ARM_compiler5无法打开安装程序
【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 在客户安装了最新版本的MDK5.37及后续更新版本,但原工程使用ARM_Compiler_5.06进行编译和调试,需安装ARM_Compiler_5.06的编译器版本,但在解压缩的过程中后续无法打开ARM_Compiler…...
PHP文字ocr识别接口示例、人工智能的发展
全球在人工智能升级的大背景下,有一定规模的制造商开始大量部署人工智能机器人、系统,以此取代危险、简单和重复性的工作。各种人工智能技术的迅猛发展,正在驱动各行业就业市场发现变革。 京东物流大家并不陌生,京东快递机器人在…...
【2024 全国青少年信息素养大赛复赛指南】算法创意实践挑战赛复赛、智能算法应用挑战赛复赛指南
目录 2024 全国青少年信息素养大赛算法创意实践挑战赛复赛指南 一、比赛内容 二、编程题作答说明 三、准备说明 四、进入复赛 五、设备检测 六、答题与交卷 全国青少年信息素养大赛智能算法应用挑战赛复赛指南 一、 比赛规则: 二、学生具体操作流程 三、 评判方法…...
构建自定义Tensorflow镜像时用到的链接地址整理
NVIDIA相关: NVIDIA CUDA镜像的docker hub:https://hub.docker.com/r/nvidia/cuda/tags?page&page_size&ordering&name12.4.1NVIDIA 构建的Tensorflow镜像包:https://docs.nvidia.com/deeplearning/frameworks/tensorflow-rele…...

C++——二叉搜索树的实现
1、二叉搜索树的概念 二叉搜索树又叫做二叉排序树,他或者是一棵空树,或者具有以下性质: 若他的左子树不为空,则左子树的所有节点的值都小于根节点的值, 若他的右子树不为空,则右子树的所有节点的值都大于…...

【AppScan】安装教程 AppScan v10 Web应用安全测试工具(附安装包)零基础入门到精通,收藏这一篇就够了
获取方式及安装教程下滑至文章底部查看 此软件“仅限学习交流,不能用于商业用途”,如用于商业用途,请到官方购买正版软件,追究法律责任与本平台无关! 配置要求 操作系统:64位 Win10、Win8、Win7 软件介绍 IBM AppScan是一款非常好用…...

Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT+开题报告+毕业论文】
一、项目简介 本项目是一套基于SSM框架实现的中小型企业财务管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单…...

c++ - 多态
文章目录 一、多态的概念二、多态使用三、多态的原理 一、多态的概念 1、概念: 多态就是具有多种形态,可以理解为同一个行为不同对象去完成表现出不同的状态,如: 二、多态使用 1、构成多态的条件 (1)派…...

亚马逊云科技EC2简明教程
💡 完全适用于新手操作的Amazon EC2引导教程 简述 在亚马逊云科技中,存在多种计算服务,在此,我们将会着重讨论Amazon EC2(以下简称EC2),EC2作为亚马逊云科技的明星产品、核心产品,是大多数开发者和企业用…...
TCP网络传输控制协议
目录 什么是TCP TCP的特点 TCP通信步骤 三次握手(建立连接) 数据传输 四次挥手(连接释放) 为什么要进行三次握手?两次握手行不行?一次握手行不行? 为什么是四次挥手?三次、两…...

PCDN技术如何应对网络带宽限制?(壹)
PCDN技术应对网络带宽限制的操作主要包括以下几个方面: 利用边缘计算资源:PCDN是以P2PCDN技术为基础,通过挖掘利用边缘网络海量碎片化闲置资源来构建内容分发网络。这意味着,当网络带宽受限时,PCDN能够更有效地利用这…...

Java数据结构-链表与LinkedList
链表 链表的概念 链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 通俗来说,相比较于顺序表(物理上连续,逻辑上也连续),链表物理上不一定连续。 链表是…...

单元测试实施最佳方案(背景、实施、覆盖率统计)
1. 什么是单元测试? 对于很多开发人员来说,单元测试一定不陌生 单元测试是白盒测试的一种形式,它的目标是测试软件的最小单元——函数、方法或类。单元测试的主要目的是验证代码的正确性,以确保每个单元按照预期执行。单元测试通…...
mysql笔记(表导出文件,文件导入表)
遇见权限问题1: cat /etc/my.cnf加入[mysqld] secure_file_priv ""遇见目录错误2:因为 MySQL 服务器没有权限在根目录下创建文件。你可以尝试将文件导出到一个 MySQL 服务器有权限写入的目录下,例如 MySQL 数据目录或 /tmp目录。sudo chmod 755 /path/to…...
Navicat 17 新特性 | 原生支持 Linux ARM 平台以及银河麒麟和统信操作系统
随着 Navicat 17 的发布,引起了业界的广泛共鸣与热烈讨论。此前,我们深入探讨了Navicat 17的多项新特性,涵盖《模型设计:引领创新,优化升级》,《高效的查询与配置》以及《用户界面交互:流畅体验…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...