Spring源码-Bean的生命周期和模板方法

Bean的生命周期

之前我们提到过SpringApplication的run方法不光可以启动程序,还会返回一个容器,为了演示Bean的从创建到销毁的整个阶段,我们会关闭掉容器。

接下来我们来看想要加入到容器当中的类,映入眼帘的是这几个方法和其注解,先来解释一下这几个注解。

@PostConstruct注解是进行Bean初始化的方法,@PreDestroy的Bean销毁的方法,这里仅限于单例Bean,多例Bean销毁的时机还是和单例Bean不太一样的。

@Value是用来进行值注入的,可以注入配置里的信息或者系统环境变量。

再来说一下这几个方法执行的顺序。先执行构造,再执行依赖注入,再执行初始化,最后执行销毁方法。

接下来我们再针对Bean进行Bean的后处理器的讲解。

默认情况下Spring的BeanFactory只有一些核心的功能,如果想要扩展功能,就要通过后处理器完成,有一类后处理器叫作Bean工厂的后处理器,它主要是补充一些Bean的定义,方便BeanFactory去进行Bean的创建。另外一类就是Bean的后处理器,Bean的后处理器是针对于Bean的声明周期的各个阶段来提供扩展功能,也就是针对Bean的创建,依赖注入,初始化这些阶段。

这里我是实现了两个后处理器接口,并对方法进行重写,方法具体的流程已经写在日志里了。

一般来说第四个方法常用于进行方法的扩展。

第五个方法中的@ConfigurationProperies是用来将Bean的属性和配置文件中的键值对做绑定。而@PostConstruct注解会有那个CommonAnnotationBeanProcessor后处理器去进行解析。

模板方法

先从模板方法的作用说起,模板方法的作用就是提高现有代码的扩展能力。

先创建一个类和一个方法用于模拟BeanFactory当中的getBean方法,如下实现。

但是这样的的代码存在一个问题,就是它的可扩展性比较差,我们代码是直接写死的,比如说现在我们需要在依赖注入阶段去识别@Autowired和@Resource这两个注解,那么我们肯定需要对现有的代码做改写,去添加一些可以识别这两个注解的逻辑,如果我们后续还要添加新的功能,还需要进行改写,这样就会使方法越来越臃肿。

解决方法是这样的,我们创建了一个接口,如果我们想给哪个阶段去进行功能上的扩展,就在这个接口当中去定义相应的方法。

就是说如果是确定的,不变的逻辑,就放在我们的类里,这当然是没问题的,但是如果是不确定的,变化的逻辑,就抽象到接口当中。

当我们要进行扩展时,就在对应的阶段(依赖注入阶段)进行方法的调用,但是我们可能要做不同的扩展,添加不同的BeanPostPreocessor(当前接口不同的实现类),所以我们就创建一个集合去存储我们的后处理器(实现类),然后遍历所有的后处理器,让每一个后处理器都去执行inject的方法。

还有就是如果我们要完成原始对象的依赖注入,就要把原始对象当作参数传入到方法当中,只有有了原始对象,才能去分析原始分析,对原始对象做一些操作啊之类的。

然后我们还需要一个方法去添加我们的后处理器。

某个方法当中,会有一些固定不变的逻辑,而对于会变化的,具有不确定性的处理逻辑呢,就抽象成接口,将来如果要进行扩展了,就去进行具体的实现比如我们的解析那两个注解,再去进行遍历调用。这样的代码是动静结合的,具有高扩展性和很强的灵活性。

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

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

相关文章

Mysql数据库基础篇笔记

目录 sql语句 DDL——数据库定义语言(定义库,表,字段) 数据库操作: 表操作: DML 增删改语句 DQL 语法编写顺序: 条件查询 DCL 用户管理: 权限管理: 函数 常见字符串内置函…

算法编程题-煎饼排序 不含AAA或者BBB的字符串

算法编程题-煎饼排序 &&不含AAA或者BBB的字符串 煎饼排序原题描述思路简述代码实现复杂度分析 不含AAA或者BBB的字符串原题描述思路简述代码实现复杂度分析 摘要:本文将对两道LeetCode原题进行介绍,分别是煎饼排序和不含AAA或者BBB的字符串。在陈…

分享一款 Vue 图片编辑插件 (推荐)

💥本篇文章给大家分享一款强大到没朋友的Vue图片编辑插件,可以对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本等,快来试试并收藏吧!💕 这是一款对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本在线处理的图片处…

MySQL 核心基础 | Pandaer杂货铺

MySQL一个后端开发必须会接触的中间件,也是关系型数据库的代表。如果你希望看下去这篇文章,需要你有使用MySQL或者相关关系型数据库的经验,不然这篇文章在你眼中就会索然无味了。 这篇文章不会讲解如何使用MySQL,例如如何安装&am…

【网络】应用层协议HTTPHTTPcookie与sessionHTTPS协议原理

主页:醋溜马桶圈-CSDN博客 专栏:计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.应用层协议HTTP 2.认识 URL 2.1 urlencode 和 urldecode 3.HTTP 协议请求与响应格式 3.1 HTTP 请求 3.2 HTTP 响应 …

搭建业务的性能优化指南

这是一篇搭建业务优化的心路历程,也是写给搭建业务的性能优化指南。 前言 直到今天,淘内的页面大多都迁移到了 SSR,从我们终端平台 - 搭建研发团队的视角看,业务大致可以分为两类 —— 搭建派 和 源码派。 这两者互不冲突&#xf…

Swift实现高效链表排序:一步步解读

文章目录 前言摘要问题描述题解解题思路Swift 实现代码代码分析示例测试与结果 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 148. 排序链表 不积跬步,无以至千里;不积小流…

开源 - Ideal库 - Excel帮助类,TableHelper实现(三)

书接上回,我们今天继续讲解实现对象集合与DataTable的相互转换。 01、把表格转换为对象集合 该方法是将表格的列名称作为类的属性名,将表格的行数据转为类的对象。从而实现表格转换为对象集合。同时我们约定如果类的属性设置了DescriptionAttribute特性…

基于DHCP,ACL的通信

该问题为华为的学习资料 1.首先把所有的PC机全部设置为DHCP 2.配置地址 3.ospf 4.dhcp 5.acl AR1 dhcp en interface GigabitEthernet0/0/0ip address 192.168.1.254 255.255.255.0 dhcp select global interface GigabitEthernet0/0/1ip address 10.1.12.1 255.255.255.…

基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于深度学习的十二生肖图像识别系统,旨在利用卷积神经网络(CNN)进行图像分类,特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型:ResNet50和VGG16,进行图像的特征提…

探索温度计的数字化设计:一个可视化温度数据的Web图表案例

随着科技的发展,数据可视化在各个领域中的应用越来越广泛。在温度监控和展示方面,传统的温度计已逐渐被数字化温度计所取代。本文将介绍一个使用Echarts库创建的温度计Web图表,该图表通过动态数据可视化展示了温度值,并通过渐变色…

Attention显存统计与分析

Attention显存估计 简单的Attention函数 import torch import torch.nn as nn import einops class Attention(nn.Module):def __init__(self, dim, num_heads8, qkv_biasFalse, qk_scaleNone, attn_drop0., proj_drop0.):super().__init__()self.num_heads num_headshead_d…

[MacOS] [kubernetes] MacOS玩转虚拟化最佳实践

❓ 为什么不在MacOS本机安装呢?因为M系列芯片是Arm架构,与生产环境或者在本地调试时候,安装虚拟镜像和X86不同,造成不必要的切换环境的额外成本,所以在虚拟化的x86调试 步骤 & 详情 一: 安装OrbStack & 并配置…

Unity世界坐标转屏幕坐标报错解决办法。

问题描述,如果你在脚本中尝试使用Camera.转换世界坐标的时候发现点不出来,可以点到你的Camera这个方法看能否跳转,如果能够跳转,并且这个脚本是你自己写的,那么恭喜你,下面就是解决办法,直接将C…

系统监控——分布式链路追踪系统

摘要 本文深入探讨了分布式链路追踪系统的必要性与实施细节。随着软件架构的复杂化,传统的日志分析方法已不足以应对问题定位的需求。文章首先解释了链路追踪的基本概念,如Trace和Span,并讨论了其基本原理。接着,文章介绍了SkyWa…

IAR中编译下载未下载问题

第一张图片是正常下载,第二张未正常下载。经过查看download选项发现 启用了 suppress download (禁用下载)

【UE5 C++】判断两点连线是否穿过球体

目录 前言 原理 代码 测试 结果 前言 通过数学原理判断空间中任意两点的连线是否穿过球体,再通过射线检测检验算法的正确性。 原理 (1)设球体球心的坐标为 ,半径为r; (2)设线段中A点的坐…

网络安全之IP伪造

眼下非常多站点的涉及存在一些安全漏洞,黑客easy使用ip伪造、session劫持、xss攻击、session注入等手段危害站点安全。在纪录片《互联网之子》(建议搞IT的都要看下)中。亚伦斯沃茨(真实人物,神一般的存在)涉…

《运放秘籍》第二部:仪表放大器专项知识点总结

一、差分放大器与仪表放大器的讨论 1.1. 仪放的前世今生——差分放大器原理? 1.2. 差分放大的原理 1.3. 差分放大器检测电流 1.4. 差分放大器端一:输入阻抗 1.5. 差分放大器端二:共模抑制比 1.6. 为什么关注输入阻抗?共模抑…

AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,

一、AJAX是什么 概念 &#xff1a; AJAX是一种与服务器&#xff08;后端&#xff09;通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…