高频:spring知识

news2024/12/23 6:06:51

1、bean的生命周期?

主要阶段

初始化

org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@67424e82: startup date []; root of context hierarchy

org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [spring-bean.xml]

{BeanFactoryPostProcessor} 【Constructor】 Method

{BeanFactoryPostProcessor} 【postProcessBeanFactory】 Method

{InstantiationAwareBeanPostProcessor} 【Constructor】 Method

{BeanPostProcessor} 【Constructor】 Method

{InstantiationAwareBeanPostProcessor} 【postProcess[Before]Instantiation】 Method

{AccountBean} 【Constructor】 Method

{InstantiationAwareBeanPostProcessor} 【postProcess[After]Instantiation】 Method

{InstantiationAwareBeanPostProcessor} 【postProcessPropertyValues】 Method,[Bean] = AccountBean{accountNo='null', openDate='null'}, [BeanName] = accountBean

{AccountBean} 的【setAccountNo】方法

{AccountBean} 的【setOpenDate】方法

{BeanNameAware} 的【setBeanName】方法

{BeanFactoryAware} 的【setBeanFactory】方法

{InstantiationAwareBeanPostProcessor} 【postProcess[Before]Initialization】 Method

{BeanPostProcessor} 的【postProcess[Before]Initialization】方法【beanName】: accountBean

{InitializingBean} 的【afterPropertiesSet】方法

{AccountBean} 的【init-method】方法

{InstantiationAwareBeanPostProcessor} 【postProcess[After]Initialization】Method

{BeanPostProcessor} 的【postProcess[After]Initialization】方法【beanName】: accountBean

AccountBean{accountNo='00001', openDate='2017-12-05'}

关闭

org.springframework.context.support.ClassPathXmlApplicationContext doClose

信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@67424e82: startup date [Sun Dec 10 15:35:01 CST 2017]; root of context hierarchy

{DisposableBean} 的【destroy】方法

{AccountBean} 的【destroy-method】方法

2、三级缓存是如何解决循环依赖的?

三级缓存

Spring 三级缓存指的是 Spring 在解决循环依赖问题时所采用的三级缓存机制,分别是:

1. 一级缓存:单例对象缓存(Singleton Objects Cache),用于存储已经创建好的单例 Bean 实例。缓存键为 Bean 名称,值为 Bean 实例。

2. 二级缓存:早期单例对象缓存(Early Singleton Objects Cache),用于存储已经实例化但尚未完成初始化的早期 Bean 实例。缓存键为 Bean 名称,值为 Bean 实例。

3. 三级缓存:单例对象工厂缓存(Singleton Objects Factory Cache),用于存储创建单例 Bean 实例的工厂对象。缓存键为 Bean 名称,值为 ObjectFactory 实例。

这三级缓存协同工作,解决了 Spring 容器中单例 Bean 的循环依赖问题。

执行流程

在 Spring 创建 Bean 的过程中,会在以下阶段将 Bean 放入三级缓存:

1. 一级缓存:当 Bean 完全创建好并完成初始化后,Spring 会将其放入一级缓存。这意味着 Bean 已经被填充了属性值,执行了初始化方法(如 `@PostConstruct` 注解的方法或 `afterPropertiesSet()` 方法),并且应用了相关的 Bean 后置处理器。

2. 二级缓存:当 Bean 实例化完成(通过构造器创建实例)但尚未完成初始化时,Spring 会将其放入二级缓存。这意味着 Bean 已经创建了实例,但尚未填充属性值和执行初始化方法。

3. 三级缓存:在 Bean 实例化之前,Spring 会将创建 Bean 实例的工厂对象(`ObjectFactory`)放入三级缓存。这个工厂对象负责创建和初始化 Bean 实例。

3、AOP实现原理?

什么是AOP?

  1. AOP 是 Aspect Oriented Programming(面向切面编程) 的简称,和OOP(面向对象编程)一样是一种编程思想,是对OOP的一种补充。

  2. AOP旨在将横切关注点(crosscutting concern)从业务主体逻辑中进行剥离,实现关注点分离,以提高程序的模块化程度(及业务模块只需关注业务逻辑,无需关注日志、安全、事务等通用逻辑)

Spring AOP的动态代理有2种实现方式

  1. JDK动态代理(JDKDynamicAopProxy):基于接口实现,底层基于反射

  2. CGLIB动态代理(CGLIBAopProxy):基于继承实现

Spring 如何选择动态代理方式 ?(以Spring 4.3.17为例)

源码见:DefaultAopProxyFactory - > createAopProxy

  • 当代理对象实现了接口时,Spring默认使用JDK的动态代理。

  • 当Bean没有实现接口时,Spring默认使用CGLIB动态代理。

  • 当代理对象实现了接口时,也可以强制使用CGLIB(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)

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

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

相关文章

品牌升级 | 图扑物联正式启用新LOGO

为进一步提升品牌形象&#xff0c;提高品牌影响力&#xff0c;2024年&#xff0c;我们迎来了一次重要的品牌升级——LOGO迭代。此次升级&#xff0c;在传承与创新中既保留了公司的核心精神&#xff0c;又融入了新的视觉语言&#xff0c;不仅代表了公司的新形象、新面貌&#xf…

当运维深陷“困境”,如何“破旧立新”?

背景 先来看下运维小伙伴们遇到的几种境遇&#xff1a; 投产变更&#xff0c;流程流于形式 投产步骤特别复杂&#xff0c;几百套系统几百种投产方式&#xff0c;公司的测试环境流于形式&#xff0c;经常会有投产文档和真实操作不一致的情况 几百套系统&#xff0c;几十种操作…

rhce证书含金量高吗?rhce考试包括哪些内容?考完工资多少?

rhce证书含金量 高吗&#xff1f; 随着目前国内IT职业的飞速发展&#xff0c;RHCE已经成为IT职业的首选认证、高薪亮点。Linux人才出现大比例短缺的状况&#xff0c;企业对Linux人才的需求也继续升温。那相关认证RHCE现在具有怎样的含金量呢&#xff0c;本期小编给大家分析分析…

Docker入门笔记(1)

Docker入门笔记&#xff08;1&#xff09; 容器技术入门 之前我的WIT问卷管理系统在阿里云上部署需要好多配置&#xff0c;各个环境耦合的比较紧密&#xff0c;花了不少时间去做部署和调配。 现在有了Docker以后&#xff0c;我们可以把各种组件配置好&#xff0c;然后打包成…

docker部署Atheos云IDE平台

Codiad 是一个基于 Web 的 IDE 框架 部署 下载镜像 docker pull hlsiira/atheosvim docker-compose.yaml version: 3 services:atheos:image: hlsiira/atheosports:- 8565:80container_name: atheosrestart: always启动 docker-compose up -d访问 http://x.x.x.x:8565

【网络安全】 MSF生成木马教程

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 环境准备&#xff1a; 名称系统IP攻击机Kali Linux10.3.0.231客户端Windows 710.3.0.234 一、生…

1688商品详情数据采集(商品属性,规格,价格,详情图等)

京东商品详情数据采集是一个复杂但重要的过程&#xff0c;它涉及获取商品的详细信息&#xff0c;包括商品属性、规格、价格以及详情图等。以下是关于如何进行京东商品详情数据采集的基本步骤&#xff1a; 确定采集目标&#xff1a;首先&#xff0c;你需要明确需要采集的商品信…

#QT(显示组件、日期时间组件)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a; 3.记录 4.代码 #include "widget.h" #include "ui_widget.h" #include <QDateTime> #include <QCalendar> #include <QCalendarWidget> Widget::Widget(QWidget *parent): QWidget(pare…

【Vue3】学习命名路由和嵌套路由

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

ARM 汇编指令:(五)CMP指令

目录 1.CMP比较指令 2.指令条件码 cond 1.CMP比较指令 CMP指令是计算机指令集中的一种比较指令&#xff0c;用于比较两个操作数的大小关系或相等性&#xff0c;并根据比较结果设置或更新条件码寄存器&#xff08;或程序状态字&#xff09;的标志位。 指令格式&#xff1a;C…

BEVFormer代码运行笔记

1. 代码下载 git clone https://github.com/fundamentalvision/BEVFormer.git 2. 环境配置 使用conda创建环境 conda create -n open-mmlab python3.8 -y 进入环境 conda activate open-mmlab 允许使用pip安装依赖库 export PIP_REQUIRE_VIRTUALENVfalse 安装pytorch和…

【C++算法模板】图的存储-邻接矩阵

文章目录 邻接矩阵洛谷3643 图的存储 邻接矩阵 邻接矩阵相比于上一篇博客邻接表的讲解要简单得多 数据结构&#xff0c;如果将二维数组 g g g 定义为全局变量&#xff0c;那默认初始化应该为 0 0 0 &#xff0c;如果题目中存在自环&#xff0c;可以做特判&#xff0c; m e …

300分钟吃透分布式缓存-28讲:如何构建一个高性能、易扩展的Redis集群?

Redis 集群的分布式方案主要有 3 种。分别是 Client 端分区方案&#xff0c;Proxy 分区方案&#xff0c;以及原生的 Redis Cluster 分区方案。 Client 端分区 Client 端分区方案就是由 Client 决定数据被存储到哪个 Redis 分片&#xff0c;或者由哪个 Redis 分片来获取数据。…

深度解析Kafka分区策略的精妙之处

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深度解析Kafka分区策略的精妙之处 前言分区的基本概念1. Kafka 分区的定义&#xff1a;2. Kafka 分区的基本原理&#xff1a;3. 为何分区是 Kafka 消息传递的关键组成部分&#xff1a; 分区策略的选择…

数字化浪潮下的选择:ETU-LINK光模块写码板全新升级至400G

随着光模块市场的蓬勃发展&#xff0c;ETU研发团队致力于不断改进SFP编码工具&#xff0c;以满足日益增长的客户需求。经过不懈努力&#xff0c;我们成功推出了3.0版本的写码板&#xff0c;在硬件和软件方面都进行了全面升级&#xff0c;为用户带来了极大的便利。今天&#xff…

每日汇评:如果支撑位守住2145美元,黄金可能反弹至纪录高位

金价在周二因美国CPI数据火爆而暴跌后保持稳定&#xff1b; 美元和美债收益率在美元/日元下跌中暂停反弹&#xff1b; 随着美国CPI的出炉&#xff0c;市场焦点转向周四的零售销售和PPI数据&#xff1b; 金价在2160美元附近盘整&#xff0c;周二从2195美元的纪录高位回调约1%。由…

windows批处理脚本(cmd指令)

一、简介 最早期的电脑系统是DOS系统&#xff0c;DOS系统只有一个黑漆漆的窗口&#xff0c;需要自己输入命令&#xff0c;所以学习命令是很有必要的&#xff0c;那么CMD命令大全是什么?直到今天的Windows系统&#xff0c;还是离不开DOS命令的操作。如今懂得使用windows批处理脚…

C++ 作业 24/3/12

1、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height),定义公有成员函数: 初始化函数:void init(int w, int h)更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostream>using …

TS271IDT运算放大器芯片中文资料PDF数据手册引脚图图片参数价格功能

产品描述&#xff1a; TS271 是一款低成本、低功耗的单通道运算放大器&#xff0c;设计用于采用单电源或双电源供电。该运算放大器采用意法半导体硅栅CMOS工艺&#xff0c;具有出色的消耗-速度比。该放大器非常适合低功耗应用。 电源可通过引脚 8 和 4 之间连接的电阻器进行外…

Kotlin 空类型,区间,数组

目录 1. 空类型 2. 区间 3. 数组 1. 空类型 我们知道任何一种数据类型都有为空或不为空两种状态&#xff0c;在 Kotlin 中&#xff0c;若允许一个数据为空&#xff0c;则需要使用 "?"&#xff0c;默认都不能为空。 代码举例说明 // 给 notNull赋值为空&#x…