Spring底层原理(五)
Spring底层原理(五)
本章内容
介绍Aware接口与InitializingBean接口、Bean的初始化与销毁、Scope
Aware接口
作用:用于注入一些与容器相关的信息
| 类名 | 作用 |
|---|---|
| BeanNameAware | 注入Bean的名称 |
| BeanFactoryAware | 注入BeanFactory容器 |
| ApplicationContextAware | 注入ApplicationContext容器 |
| EmbeddedValueResolverAware | ${} |
🔖 注入功能使用@Autowired就能实现,为什么还要用Aware接口呢?
@Autowired的解析需要用到bean后处理器,属于扩展行为- 用
Aware接口属于内置功能,不加任何扩展,Spring就能识别
某些情况下,扩展功能会失效,而内置功能不会失效
InitializingBean接口
该接口提供了一种内置的初始化手段,内置的注入和初始化不受拓展功能的影响,总会被执行,因此Spring框架内部的类常用它
@Autowired失效分析
Java配置类不包含BeanFactoryPostProcessor的情况

Java配置类包含BeanFactoryPostProcessor的情况,创建其中的BeanFactoryPostProcessor必须提前创建Java配置类,而此时的BeanPostProcessor还未准备好,导致@Autowired等注解失效
解决办法:不要使用@Autowired与@PostConstruct注解,而是使用InitializingBean接口
案例代码
@Slf4j
@Configuration
public class Config2 {@Autowiredpublic void app(ApplicationContext context) {log.info("===== 注入容器:{}", context);}@PostConstructpublic void init(){log.info("===== 初始化");}@Beanpublic BeanFactoryPostProcessor processor1(){return beanFactory->{log.info("执行processor1");};}
}
public class A05Application {public static void main(String[] args) throws IOException {GenericApplicationContext context = new GenericApplicationContext();context.registerBean(AutowiredAnnotationBeanPostProcessor.class);context.registerBean(CommonAnnotationBeanPostProcessor.class);context.registerBean(ConfigurationClassPostProcessor.class);context.registerBean("config2",Config2.class);context.refresh();for (String name : context.getBeanDefinitionNames()) {System.out.println(name);}context.close();}
}
更正后
@Slf4j
@Configuration
public class Config2 implements InitializingBean, ApplicationContextAware {@Beanpublic BeanFactoryPostProcessor processor1(){return beanFactory->{log.info("执行processor1");};}@Overridepublic void afterPropertiesSet() throws Exception {log.info("===== 初始化");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {log.info("===== 注入容器:{}", applicationContext);}
}
Bean的初始化与销毁
初始化
- 使用
@Bean(initMethod="") - 使用
@PostConstruct注解 - 使用
InitializingBean接口
执行顺序:@PostConstruct @Bean(initMethod="") InitializingBean
销毁
- 使用
@Bean(distoryMethod="") - 使用
@PreDistory注解 - 使用
DisposableBean接口
执行顺序:@PreDistory @Bean(distoryMethod="") DisposableBean
注意:Aware接口的执行时机在(初始化/销毁)注解和接口之间
Scope
Scope的类型有哪些
- singleton:单例对象
- prototype:原型,每次获取会创建一个新的对象
- request:作用于Web的request作用域中,每次请求会创建一个新的对象
- session:作用于Web的session作用域中,每个新的会话会创建一个新的对象
- application:作用域Web的applicaion作用域中
Scope的销毁
- singleton:当容器关闭时销毁
- prototype:不受容器管控
- request:每次请求结束
- session:会话超时
- application:没有被spring正确实现
指定Bean的作用域可以使用@Scope注解指定
Web作用域演示

Scope失效问题
当在singleton作用域调用其他作用域的对象时会导致其他作用域失效,原因是因为依赖注入只会注入一次
解决方案
- 在注入的对象上使用
@Lazy注解,SpringIoC容器会在启动的时候实例化所有单实例 bean 。如果我们想要实现 Spring 在启动的时候延迟加载 bean,即在首次调用bean的时候再去执行初始化 - 指定
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS) - 使用
ObjectFactory来创建对象 - 使用ApplicationContext获取对象
原理:都是延迟其他scope bean的获取时机
相关文章:
Spring底层原理(五)
Spring底层原理(五) 本章内容 介绍Aware接口与InitializingBean接口、Bean的初始化与销毁、Scope Aware接口 作用:用于注入一些与容器相关的信息 类名作用BeanNameAware注入Bean的名称BeanFactoryAware注入BeanFactory容器ApplicationContextAware注入ApplicationContext容…...
算法的基本概念(数据结构与算法)
数据结构是指数据元素之间的关系和组织方式,在计算机科学中被广泛应用于存储和操作数据的方法和技术。 数据元素: 数据元素是构成数据的基本单位,可以是数字、字符、记录等。 数据项: 数据元素中的一个部分,表示一个属…...
高阶数据结构学习——LRU Cache
文章目录 1、了解LRU Cache(Least Recently Used缩写)2、代码实现 1、了解LRU Cache(Least Recently Used缩写) Cache是缓存,在磁盘和内存之间,内存和寄存器之间都存在,CPU和内存之间存在三级缓…...
代码冲突解决
远程仓库修改 本地代码修改 接下来我们push一下 如果使用IDE 冲突内容如下: 我们可以使用自带的工具进行修改 我们选择接受自己改动的即可 如果使用git工具怎么去处理呢 远程分支是这样 本地是这样的 add和commit之后,再pull,最后pus…...
c/c++程序的内存开辟时 的内存情况
我们写的代码都是要存放在内存空间中的,我们经常说堆区,静态区,还有栈区,相信很多人不是很明白,在今天这篇博客中让大家对它们有一个粗略的认识 1.栈区(static) 在执行函数时,函数内…...
【linux常用命令+vi编辑器_2023.11.3】
芯片开发 Linux/Unix(环境) EDA工具TCL(波形) SVN/GIT(版本控制) Makefile(脚本语言) Perl/Python(脚本语言) Vim/Gvim(编辑器) 命令…...
okhttp post请求 header post参数加密遇到的两个问题
如果你对于网络请求用了https后是否还有必要对参数加密有疑问可以看我上篇的文章:网络安全https 记得耐心看完,下面说问题: Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a 一开始以为是okhttp框架对特殊字符做了现在…...
什么是Webpack的loader和plugin?它们的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
ESXi for ARM 最新下载地址
由于VMware决定关闭 flings.vmware.com 网站,内容被迁移到不同的地方,网站跳转到 Code Samples and PowerCLI Example Scripts | VMware - VMware {code} ESXi for ARM的下载地址迁移到了 https://customerconnect.vmware.com/downloads/get-download?…...
2. 网络之网络编程
网络编程 文章目录 网络编程1. UDP1.1 DatagramSocket1.1.1 DatagramSocket 构造方法1.1.2 DatagramSocket 方法: 1.2 DatagramPacket1.2.1 DatagramPacket构造方法1.2.2 DaragramPacket方法1.2.3InetSocketAddress API 1.3 UDP回显服务器1.3.1 框架结构1.3.2 读取请…...
工作数字化的中国历程 | 从 OA 到 BPM 到数字流程自动化
业务流程是由“活动”(或称“工作任务”)构成的,在企业里的所有工作是不是都叫流程,或者属于流程的一部分,这个概念很绕,我觉得没有必要去做学究气的辨析。我曾经提出过一个从工作的两个特性(产…...
6-1 二叉排序树查找操作
description 本题要求实现二叉排序树的查找操作。 函数接口定义: BSTree SearchBST(BSTree T,ElemType e); 其中BSTree结构定义如下: typedef int ElemType; typedef struct BSTNode { ElemType data; struct BSTNode *lchild,*rchild; }BSTNode,*BS…...
服务上千家企业,矩阵通2.0重磅上线,全链路管理新媒体矩阵
自上线以来 矩阵通已服务了上千家企业级客户 覆盖汽车、家居、媒体、金融、教育等多个行业 矩阵通1.0时代 我们以“数据”为基座打造出10功能 帮助企业轻松管理新媒体矩阵 实现账号管理、数据分析、竞对监测、 人员考核、风险监管等需求 而现在 矩阵通2.0重磅上线 新增…...
【代码随想录】算法训练计划11
1、20. 有效的括号 题目: 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号…...
Jmeter之JSR223
一、JSR223组件 JSR是Java Specification Requests的缩写,意思是Java规范提案。JSR已成为Java界的一个重要标准. JSR223其实包含了有好几种组件,但是其用法都是一致的,并且都是执行一段代码,主要分类如下: JSR223 PreProcessor JSR223 Timer JSR223 S…...
c++23中的新功能之十八新增的属性
一、c23新的属性 在前面的分析中说过,各种语言的发展整体思路是一致的,即朝着更加实用、简单和更接近自然语言的方向在前进。c23中也在不断的完善和增加相关开发的一些属性和预编译处理指令,这样就可以让开发者在开发的过程中对程序进行控制…...
动手学深度学习:1.线性回归从0开始实现
动手学深度学习:1.线性回归从0开始实现 1.手动构造数据集2.小批量读取数据集3.初始化模型参数4.定义模型和损失函数5.小批量随机梯度下降更新6.训练完整代码 1.手动构造数据集 根据带有噪声的线性模型构造一个人造数据集,任务是使用这个有限样本的数据集…...
【计算机网络】应用层
应用层协议原理 客户-服务器体系结构: 特点:客户之间不能直接通信;服务器具有周知的,固定的地址,该地址称为IP地址。 配备大量主机的数据中心常被用于创建强大的虚拟服务器;P2P体系结构: 特点&…...
python 深度学习 解决遇到的报错问题9
本篇继python 深度学习 解决遇到的报错问题8-CSDN博客 目录 一、can only concatenate str (not "int") to str 二、cant convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, in…...
能源管理系统为什么选择零代码开发平台?
市面上有很多能源管理系统,但是零代码开发能源管理系统却非常少。那为什么推荐选择零代码开发平台呢?因为很多企业缺少技术人员,但是却仍然需要数字化工具和流程推进业务和项目,解决能源管理技术人员不懂代码的矛盾问题࿰…...
4步彻底清除Edge浏览器:从系统底层解决Windows默认浏览器卸载难题
4步彻底清除Edge浏览器:从系统底层解决Windows默认浏览器卸载难题 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover 一、用户痛点场景&#x…...
Twisted Protocols终极指南:快速构建高性能网络协议的简单方法
Twisted Protocols终极指南:快速构建高性能网络协议的简单方法 【免费下载链接】twisted Event-driven networking engine written in Python. 项目地址: https://gitcode.com/gh_mirrors/tw/twisted Twisted是一个用Python编写的事件驱动网络引擎࿰…...
长上下文不可强求:从 Gemini 到 Opus,1M context 为什么还没体现出应有价值
长上下文不可强求:从 Gemini 到 Opus,1M context 为什么还没体现出应有价值 摘要 过去一年,long context 一直是大模型产品最容易被拿来宣传的能力之一。32K 不够,就上 128K;128K 还不够,就上 1M。看起来&a…...
给视觉新手的保姆级教程:用Python+OpenCV玩转四步相移结构光(附代码)
零基础实战:用PythonOpenCV实现四步相移结构光三维重建 在计算机视觉领域,结构光三维重建技术因其高精度和非接触特性,被广泛应用于工业检测、逆向工程和医疗成像。对于刚接触这一领域的新手来说,最困扰的往往不是理解原理&#x…...
3分钟掌握Windows音频路由:让每个程序都有专属音频输出 [特殊字符]
3分钟掌握Windows音频路由:让每个程序都有专属音频输出 🎧 【免费下载链接】audio-router Routes audio from programs to different audio devices. 项目地址: https://gitcode.com/gh_mirrors/au/audio-router 你是否曾经遇到过这样的烦恼&…...
学生党必备:AutoDL服务器+Pycharm远程开发极简配置(含学生认证技巧)
学生党高效开发指南:AutoDLPycharm远程开发全攻略 1. 低成本深度学习开发环境搭建 作为一名深度学习爱好者,最头疼的莫过于硬件资源不足。显卡价格居高不下,笔记本跑个MNIST都卡顿,更别提训练复杂模型了。好在云服务器为我们提供了…...
任务式智能客服工作流架构设计与性能优化实战
最近在重构公司的智能客服系统,原来的系统在高并发时经常卡顿,用户排队时间长得让人抓狂。经过一番折腾,我们设计了一套基于事件驱动的任务式工作流,效果拔群,吞吐量直接翻了好几倍。今天就来聊聊这套架构的设计思路和…...
C语言:结构体(自定义类型)
目录 1. 声明 1.1 结构体的声明 1.2 结构体自引用 2. 结构体内存对齐(热门考点) 2.1 对齐规则 2.3 修改默认对齐数 3.结构体传参 4. 结构体实现位段 4.1 位段 4.2 内存分配 4.3 跨平台问题 4.4 位段的应用:IP数据报 4.5 注意事项…...
2PG450x500双齿辊破碎机CAD装配图
2PG450x500双齿辊破碎机CAD装配图是机械设计领域中用于呈现设备整体结构的关键学习资料。该设备通过两个同步旋转的齿辊实现物料的破碎功能,其核心作用在于将大块物料均匀破碎至指定粒度,满足后续加工或输送需求。装配图以二维工程语言精准描述各部件的相…...
LFM2.5-1.2B-Thinking-GGUF入门指南:Thinking模型输出后处理机制解析
LFM2.5-1.2B-Thinking-GGUF入门指南:Thinking模型输出后处理机制解析 1. 模型概述 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型,专为低资源环境优化设计。该模型采用GGUF格式存储,配合llama.cpp运行时,能够在…...
