Spring Bean的生命周期

Spring Bean 的完整生命周期主要包括以下阶段:

  1. 实例化(Instantiation):Spring 容器通过调用 Bean 的构造函数来创建 Bean 的实例。这是 Bean 生命周期的第一步。

  2. 设置属性值(Setting Bean Properties):Spring 容器通过调用 Bean 的 setter 方法来设置 Bean 的属性值,包括依赖注入(Dependency Injection)。

  3. 处理 BeanNameAware 接口(BeanNameAware):如果 Bean 实现了 BeanNameAware 接口,Spring 容器会调用其 setBeanName() 方法,传递 Bean 的名称给它。

  4. 处理 BeanFactoryAware 接口(BeanFactoryAware):如果 Bean 实现了 BeanFactoryAware 接口,Spring 容器会调用其 setBeanFactory() 方法,传递 BeanFactory 给它。

  5. 处理 ApplicationContextAware 接口(ApplicationContextAware):如果 Bean 实现了 ApplicationContextAware 接口,Spring 容器会调用其 setApplicationContext() 方法,传递 ApplicationContext 给它。

  6. BeanPostProcessor 的前置处理(BeanPostProcessor.preProcessBeforeInitialization):如果有注册的 BeanPostProcessor,Spring 容器会在 Bean 的初始化之前调用它们的 postProcessBeforeInitialization() 方法,可以在这一步对 Bean 进行额外的处理。

  7. 初始化(Initialization):Spring 容器会调用 Bean 的初始化方法,可以通过在 Bean 上标注 @PostConstruct 注解或实现 InitializingBean 接口的 afterPropertiesSet() 方法来指定初始化逻辑。

  8. BeanPostProcessor 的后置处理(BeanPostProcessor.postProcessAfterInitialization):如果有注册的 BeanPostProcessor,Spring 容器会在 Bean 的初始化之后调用它们的 postProcessAfterInitialization() 方法,可以在这一步对 Bean 进行额外的处理。

  9. 使用(Bean in Use):Bean 已经完成初始化,可以在应用程序中使用了。

  10. 销毁(Destruction):当应用程序关闭或手动销毁 Bean 时,Spring 容器会调用 Bean 的销毁方法,可以通过在 Bean 上标注 @PreDestroy 注解或实现 DisposableBean 接口的 destroy() 方法来指定销毁逻辑。

简化阶段

 

【其他说明】

BeanNameAware、BeanFactoryAware、ApplicationContextAware类似处理。

在 Spring 中,Bean 实现了 BeanNameAware 接口的方式有两种:

1.实现 BeanNameAware 接口:Bean 可以实现 BeanNameAware 接口,并实现接口中的 setBeanName() 方法,用于接收 Spring 容器传递的 Bean 的名称。例如:

public class MyBean implements BeanNameAware {
    private String beanName;

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
    }

    //...其他属性和方法
}

2.在配置文件中使用 name 属性:在 XML 或者 JavaConfig 配置文件中,可以通过设置 name 属性来显式地为 Bean 指定名称,从而实现 BeanNameAware 接口的效果。例如:

在 XML 配置中:

<bean id="myBean" class="com.example.MyBean" name="customBeanName">
    <!-- 配置其他属性 -->
</bean>

在 JavaConfig 配置(通俗叫代码注解配置)中:

@Configuration
public class MyConfig {
    @Bean(name = "customBeanName")
    public MyBean myBean() {
        // 创建 MyBean 实例并配置其他属性
        return new MyBean();
    }
}

当 Spring 容器创建 MyBean 实例时,会调用 MyBean 实现的 setBeanName() 方法或者使用配置文件中指定的 Bean 名称来传递 Bean 的名称,从而使得 MyBean 实现了 BeanNameAware 接口。在接下来的 Bean 生命周期中,MyBean 可以通过获取 beanName 属性来获取自己在容器中的名称。

ApplicationContextAwareBeanFactoryAware 是 Spring 框架中两个不同的接口,它们都用于在 Spring Bean 中获取容器的引用,但有一些区别:

  1. 功能:ApplicationContextAware 接口用于获取完整的 ApplicationContext 实例,包括其父 ApplicationContext,可以用于进行更加灵活和强大的操作,如获取环境信息、获取配置信息等。而 BeanFactoryAware 接口只能获取当前 Bean 所属的 BeanFactory 实例,相对来说功能较为简单,只能进行基本的 Bean 获取操作。

  2. 引用类型:ApplicationContextAware 接口的引用类型是 ApplicationContext,而 BeanFactoryAware 接口的引用类型是 BeanFactoryApplicationContextBeanFactory 的子接口,它包含了 BeanFactory 的所有功能,并且还提供了更多的功能,如国际化、事件发布、AOP 等。

  3. 使用时机:ApplicationContextAware 接口适用于需要在 Bean 中获取完整的 ApplicationContext 实例的场景,比如需要访问 ApplicationContext 的环境属性、配置信息等高级功能。而 BeanFactoryAware 接口适用于需要在 Bean 中获取当前 Bean 所属的 BeanFactory 实例的场景,比如需要获取其他 Bean 实例的引用等。

  4. 推荐使用:在现代的 Spring 应用中,推荐使用 ApplicationContextAware 接口,因为它提供了更加灵活和强大的功能,包括获取完整的 ApplicationContext 实例和支持更多的高级特性。而 BeanFactoryAware 接口则相对较为简单,适用于一些简单的场景。同时,也可以使用更加细粒度的方式,如使用 @Autowired 注解来注入需要的 Bean 实例,而不是直接使用 ApplicationContextAwareBeanFactoryAware 接口。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【分布式】熔断、降级傻傻分不清楚-熔断和降级的真实关系

文章目录 前言降级熔断什么是服务熔断 熔断和降级的关系降级方式1、熔断降级&#xff08;不可用&#xff09;2、超时降级3、限流降级 总结 前言 刚开始我以为熔断和降级是一体的&#xff0c;以为他们必须配合使用&#xff1b; 只不过名字不一样而已&#xff0c;但是当我经过思…

如何实现视觉识别形状

1. 功能说明 通过摄像头识别圆形及矩形两种形状。 2. 电子硬件 本实验中采用了以下硬件&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigfish2.1 电池7.4V锂电池通信2510通信转接板WiFi路由器 其它 摄像头 配置OpenCV的Visual Studio 2015.…

MySQL having关键字详解、与where的区别

1、having关键字概览 1.1、作用 对查询的数据进行筛选 1.2、having关键字产生的原因 使用where对查询的数据进行筛选时&#xff0c;where子句中无法使用聚合函数&#xff0c;所以引出having关键字 1.3、having使用语法 having单独使用&#xff08;不与group by一起使用&a…

(SQL学习随笔3)SQL语法——SELECT语句

导航 基本认识FROM关键字LIMIT与OFFSETORDER BY WHERE条件查询单值比较多条件组合范围筛选空值匹配LIKE通配条件分组 运算符和函数数据变换 分组运算表连接内连接左(右)外连接全外连接 外键约束窗口函数UNION&#xff1a;表上下拼接子查询条件判断PostgreSQLMySQL 基本认识 SE…

两种方法实现杨辉三角(java实现)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Consul TTL健康检查方式

consul比较常用的健康检查方式为http健康检查方式&#xff0c;也还有使用TTL方式来进行健康检查的&#xff0c;下面从spring-cloud-consul-discovery这个SDK来着手分析。 构建ConsulAutoRegistration&#xff0c;这里的工作是组成服务注册的报文&#xff0c;有一个setCheck方法…

钉钉消息防撤回功能研究与实现-可查看历史消息[文件/图文/管理员/链接 撤回拦截]

研究背景 由于在某个大学进行上课的时候,遇到的某个老师,总是习惯发过的消息,到第二天的时候撤回,我们用聊天工具的其中一个原因,不就是因为可以随时去查看发过的消息吗&#xff0c;&#xff0c;而这位老师的操作,也让包括我在内的很多人感到痛不欲生。 想一想,当自己想要去看下…

常见的九种大数据分析模型

常见的9种大数据分析模型分别为&#xff1a; 事件分析、 属性分析、 渠道分析、 Session分析、 留存分析、 归因分析、 漏斗分析、 路径分析、 分布分析 1、【事件分析】 事件分析&#xff0c;是指用户在 APP、网站等应用上发生的行为&#xff0c;即何人&#xff0c;何时&…

【消费战略】解读100个食品品牌丨王小卤 4年10亿爆品破局

爆品破局 王小卤的聚焦发展! 王小卤创建于 2016 年&#xff0c;与饮料行业的独角兽元气森林同年。 相较于元气森林的快速增长&#xff0c;王小卤历经 三年坎坷之路&#xff0c;直至 2019 年才踏上高增长的赛道&#xff0c;实现四年十亿的增长。 “所有的消费品都值得重新 做…

网络安全-kali配置ssh服务+敏感文件泄+dirsearch脚本

网络安全-kali配置ssh服务敏感文件泄dirsearch脚本 seccure shell 就是加密的telnet 远程用的 service ssh start 开启ssh服务metstat -tpan |gerp 22 监听这个端口是否开启 可以看到本地的22端口这个文件是/etc/ssh/sshd_config 输入 set number 找到第57行 把这个前面的#注…

【记录】Truenas Scale|中危漏洞,需要SMB签名

部分内容参考&#xff1a;等保测试问题——需要SMB签名(SMB Signing not Required) 以及 ChatGPT。 Truenas常用SMB服务&#xff0c;但默认并不开启SMB签名。这样具有中间人攻击的风险。 一、漏洞详情 1.1 漏洞报告 漏洞提示如下&#xff1a; 1.2 漏洞介绍 SMB是一个协议名…

人工智能发展到GPT4经历了什么,从专家系统到机器学习再到深度学习,从大模型到现在的GPT4

大家好&#xff0c;我是微学AI&#xff0c;今天给大家讲一下人工智能的发展&#xff0c;从专家系统到机器学习再到深度学习&#xff0c;从大模型到现在的GPT4&#xff0c;讲这个的目的是让每个人都懂得人工智能&#xff0c;每个人都懂得人工智能的发展&#xff0c;未来人工智能…

4.13(LoadLibrary)

接着之前预习的知识&#xff0c;我观察的自己编译出来的bin LoadLibraryExA LoadLibraryExA函数进去&#xff0c;现时用RtInitAnsiString函数初始化了ANSI的计数字符串&#xff0c;底层是调用了LoadLibraryExW函数&#xff0c;在LoadLibrarExW函数里做了unicode的计数字符串的…

python入门(五) vscode配置Anaconda 环境,代码自动提示

文章目录 1.conda的下载地址:1.配置conda的环境变量安装conda配置path 2.vcode配置python插件3.配置conda1) Select Interpreter2) 选择conda环境 4.测试 vscode配置Anaconda 环境&#xff0c;代码自动提示. 本人工作中&#xff0c;用到了ai相关技术&#xff0c;但是java出身&a…

七项新发布,亚马逊云科技Amazon S3持续进化

17年前的3月14日&#xff0c;亚马逊云科技推出了一项“非常简单的”对象存储服务&#xff08;Amazon Simple Storage Service&#xff09;。该服务允许开发人员创建、列出和删除私有存储空间&#xff08;称为存储桶&#xff09;、上传和下载文件以及管理其访问权限。当时&#…

北京筑龙:采购供应链平台-构建能源企业数智供应链的必经之路

4月13至14日&#xff0c;“中国国际管道会议&#xff08;CIPC&#xff09;暨技术装备与成果展”高峰论坛在北京举行。来自国内外管道领域的院士、知名专家、学者齐聚一堂&#xff0c;共同探讨新时代背景下管道技术领域的发展方向。作为采购供应链数字化产品及服务提供商&#x…

每日学术速递4.13

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Slide-Transformer: Hierarchical Vision Transformer with Local Self-Attention(CVPR 2023) 标题&#xff1a;Slide-Transformer&#xff1a;具有局部自注意力的分层视觉变换器 …

Camera | 8.让rk3568支持前后置摄像头

一、目标 本文主要目标是&#xff0c;支持前置摄像头0v5648、后置摄像头ov13850&#xff0c;以及移植过程遇到的一些小问题的解决。 1. 摄像头连接图 参考上图&#xff0c;摄像头详细信息如下&#xff1a; 2个摄像头均连接在I2C通道42个摄像头共用同一个MIPI数据通道2个摄像…

LeetCode:454. 四数相加 II —— 哈希表为什么叫哈希表~

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 hash是什么&#xff0c;哈希表为什么叫哈希表&#xff1f; 一、&#x1f331;454. 四数…

Java基础(八)异常处理

1. 异常概述 1.1 什么是生活的异常 男主角小明每天开车上班&#xff0c;正常车程1小时。但是&#xff0c;不出意外的话&#xff0c;可能会出现意外。 出现意外&#xff0c;即为异常情况。我们会做相应的处理。如果不处理&#xff0c;到不了公司。处理完了&#xff0c;就可以…