【spring】Bean的生命周期回调函数和Bean的循环依赖

目录

1、Bean的生命周期

2、Bean的生命周期回调函数 

2.1、初始化的生命周期回调

2.2、销毁的生命周期回调

3、Bean的循环依赖

1、Bean的生命周期

        spring的bean的生命周期主要是创建bean的过程,一个bean的生命周期主要是4个步骤:实例化,属性注入,初始化,销毁

再详细一点可以拆分为:

(1)配置bean,通过@Component @Bean等方式都可以。

(2)加载Spring容器

(3)实例化,例如:(BeanService beanService = new BeanService())

(4)解析依赖注入(解析@Autowired @Value等自动注入注解)

(5)初始化(调用初始化回调方法,由程序员来配置)

(6)最终放入一个Map集合,Map<beanName, bean对象>

(7)spring容器.getBean("beanName")---->Map<beanName, bean对象>

(8)spring容器关闭 bean就会销毁(调用销毁回调方法,由程序员来配置)

2、Bean的生命周期回调函数 

2.1、初始化的生命周期回调

初始化(调用初始化回调方法,由程序员来配置),有三种方式来配置初始化回调方法

示例:

//自定义类LtService
public class LtService implements InitializingBean {// 基于接口实现初始化回调方法,重写了InitializingBean接口中的afterPropertiesSet()方法@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("接口:初始化");//接口实现初始化回调方法}// 基于注解实现初始化回调方法@PostConstructpublic void init() throws Exception {System.out.println("注解@PostConstruct:初始化");//注解@PostConstruct实现初始化回调方法}// 基于initMethod属性实现初始化回调方法public void init2() throws Exception {System.out.println("initMethod属性:初始化");//initMethod属性实现初始化回调方法}
}//测试类LifeCallbackTest
@SpringBootTest(classes = LifeCallbackTest.class)
public class LifeCallbackTest {//通过@Bean的方式把LtService配置成bean@Bean(initMethod = "init2")public LtService ltService(){return new LtService();}@Testpublic void test(@Autowired LtService ltService){System.out.println(ltService.getClass());}
}

从上面的结果可以看出他们的顺序是:先注解,再接口,最后initMethod属性

小补充:

2.2、销毁的生命周期回调

1.在springboot中当jvm进程结束后会自动调用容器.close0),自动销毁bean

2.在spring中,需要手动调用容器.close()来销毁bean

销毁(调用销毁回调方法,由程序员来配置),有三种方式来配置销毁回调方法

示例:

//自定义类LtService
//public class LtService implements InitializingBean , DisposableBean {
public class LtService implements DisposableBean {// 基于接口实现销毁回调方法,重写了DisposableBean接口中的destroy()方法@Overridepublic void destroy() throws Exception {System.out.println("接口:销毁");//接口实现销毁回调方法}// 基于注解实现销毁回调方法@PreDestroypublic void destroy2() throws Exception {System.out.println("注解@PreDestroy:销毁");//注解@PreDestroy实现销毁回调方法}// 基于destroyMethod属性实现销毁回调方法@PostConstructpublic void destroy3() throws Exception {System.out.println("destroyMethod属性:初始化");//destroyMethod属性实现销毁回调方法}
}//测试类
@SpringBootTest(classes = LifeCallbackTest.class)
public class LifeCallbackTest {//@Bean(initMethod = "init2", destroyMethod = "destroy3")@Bean(destroyMethod = "destroy3")public LtService ltService(){return new LtService();}@Testpublic void test(@Autowired LtService ltService){System.out.println(ltService.getClass());}
}

从上面的结果可以看出他们的顺序是:先注解,再接口,最后destroyMethod属性

3、Bean的循环依赖

        循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A。如下图:

        注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。

        Spring已经帮我们解决了循环依赖这个问题,这涉及到Spring底层源码的概念(Spring怎么解决的循环依赖)。但是,在SpringBoot中会报错,因为SpringBoot认为是一种不合理的设计

循环依赖在SpringBoot中会报错的解决方式:

1、在配置文件中放开循环依赖的限制

#放开循环依赖的限制
spring.main.allow-circular-references=true

2、代码设计层面:

a.把依赖的方法,直接写在本类中

b.添加一个中间类, 中间类去依赖A\B,然后让中间类去阻止他们的依赖方法

3、延迟注入

a.添加需要依赖的构造函数参数

b.添加@Lazy注解

@Lazy
public BeanA(BeanB beanb){this.beanb = beanb;
}@Lazy
public Bean(BeanA beana){this.beana = beana;
}

推荐: 

【Spring】IOC/DI中常用的注解@Lazy、@Scope与@Conditional-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138277932?spm=1001.2014.3001.5501【Spring】IOC/DI中常用的注解@Order与@DependsOn-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138167160?spm=1001.2014.3001.5501【Spring】依赖注入(DI)时常用的注解@Autowired和@Value_配置类 使用@autowired 类型注入-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137784706?spm=1001.2014.3001.5501

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

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

相关文章

AI时代的就业转型与个人发展

AI时代的就业转型与个人发展&#xff1a;机遇与挑战并存 AI出现的背景&#xff1a;技术革命的浪潮 随着21世纪信息技术的突飞猛进&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;作为一场技术革命的产物&#xff0c;正逐渐从科幻小说走向现实世界的…

Pycharm链接远程服务器GPU跑深度学习模型

我们在学习深度学习时&#xff0c;常常会遇到自己笔记本电脑性能不够&#xff0c;显卡性能低&#xff0c;在运行深度学习项目的时候很浪费时间。如果实验室有可用于深度学习的服务器的话&#xff0c;会大大减少代码执行时间&#xff0c;服务器上的GPU算力一般都很高。 本文主要…

密室逃脱游戏-第12届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第58讲。 密室逃脱游戏&…

Unity与C#的关系

第一&#xff0c;我们首先需要知道Unity与C#的关系是什么&#xff1f; 第二&#xff0c;我们要明白为什么Unity会使用C#&#xff0c;而不是C&#xff1f; 第三&#xff0c;我们需要知道Unity是怎么使用C#的&#xff1f; 第一点&#xff1a; 先说结论&#xff1a;C#是Unity用…

Linux性能压测指标信息

1、CPU使用 服务器CPU整体负载信息 可以查看top命令输出的第三行数据 查看多核CPU命令 mpstat -P ALL 和 sar -P ALL top命令执行后输入1 2、内存使用 top命令或者free命令来查看内存的信息&#xff0c;第一行是物理内存使用&#xff0c;第二行是虚拟内存使用(交换空间)。…

mvc 异步请求、异步连接、异步表单

》》》 利用Jquery ajax 》》》 mvc 异步表单 c# MVC 添加异步 jquery.unobtrusive-ajax.min.js 方法 具–>Nuget程序包管理器–>程序包管理器控制台 在控制台输入&#xff1a;PM>Install-Package Microsoft.jQuery.Unobtrusive.Ajax –version 3.0.0 回车执行即可在…

多C段的美国站群服务器有什么用途?

多C段的美国站群服务器有什么用途? 多C段的美国站群服务器是一种常见的网络运营策略&#xff0c;其用途主要体现在以下几个方面&#xff1a; 多C段的美国站群服务器有什么用途? 1. 提高站点排名和流量 部署多个站点在不同的C段IP地址上&#xff0c;可以通过不同的IP地址发布…

AI视频教程下载:学会用AI创作文本图片音频视频

在不断发展的科技领域&#xff0c;人工智能 (AI) 是毋庸置疑的冠军&#xff0c;它是一种不断创新的力量&#xff0c;在我们的生活中扮演着越来越重要的角色。随着 2023 年的到来&#xff0c;我们诚挚地欢迎您加入人工智能精通课程的大门。 这不仅仅是一个课程&#xff0c;它专为…

docker部署elasticsearch7.7.0级拼音(pinyin)插件和分词(ik)插件

拉取并启动es docker run -d --namees -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch:7.7.0安装pinyin插件 下载pinyin插件 下载ik插件 上传插件到服务器 docker cp /path/to/elasticsearch-analysis-pinyin-7.7.0.zip elasticsearch…

【Pytorch】5.DataLoder的使用

什么是DataLoader 个人理解是&#xff0c;如果Dataset的所有数据相当于一副扑克牌&#xff0c;DataLoader就相当于从扑克牌中抽取几张&#xff0c;我们可以规定一次抽取的张数&#xff0c;或者以什么规则进行抽取 DataLoader的使用 查阅官网的文档&#xff0c;主要有这几个参数…

libcity笔记:详细流程(以DeepMove为例)

1 主调用 python run_model.py --task traj_loc_pred --model DeepMove --dataset gowalla --batch_size5有task、dataset、model三个必须命令行参数batch_size一个可选命令行参数没有confg_file 1.1 libcity/utils/argument_list.py/str2bool 将字符串表示的布尔值转换为 Pyt…

C++字模软件发送 单片机接收显示

/****先定义数组类型再赋值**L310*********/ /*2014 8 21 10:01**PAST*CODE1000**TEST**/ #include<reg51.h> #define uint unsigned int #define uchar unsigned char sfr AUXR0x8e; //辅助寄存器 sfr SADDR0xA9; …

java之web笔记

1.Servlet技术 1.1 JavaWeb概述 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义:“JavaWeb应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。 Java Web应用中可以包含如下内容…

OpenGrok使用

以前都是用的find&#xff0c;或者VScode里面的浏览&#xff0c;但是到了Android这个就不行了&#xff0c;代码太多了。都在用OpenGrok&#xff0c;所以俺也用一下。 这里有两个步骤&#xff0c;一个是安装&#xff0c;是一个使用。 1 安装 大概看了一下&#xff0c;安装是to…

前端nginx(windows操作系统)学习配置开发验证

Nginx概述 Nginx 作为负载均衡在 Linux 系统上具备很好的并发性能&#xff0c;并且占用极小的内存。但是在 Windows 系统上并不支撑较高并发&#xff0c;所以在Windows系统上选用Nginx作为负载均衡&#xff0c;需要考虑并发情况。 若并发需求低于 300&#xff0c;部署集群仅以…

AI数据中心网络技术选型,InfiniBand与RoCE对比分析

InfiniBand与RoCE对比分析&#xff1a;AI数据中心网络选择指南 随着 AI 技术的蓬勃发展&#xff0c;其对数据中心网络的要求也日益严苛。低延迟、高吞吐量的网络对于处理复杂的数据密集型工作负载至关重要。本文分析了 InfiniBand 和 RoCE 两种数据中心网络技术&#xff0c;帮助…

微信公众号营销攻略,2024年微信引流商业最佳实践

确实&#xff0c;微信是中国市场上不可或缺的营销工具。下面是一些关于如何在微信上进行有效营销的最佳实践&#xff0c;以及如何通过微信公众号进行广告宣传&#xff0c;以提升品牌知名度并推动业务增长。 拥有一个微信公众号是进行微信营销的关键第一步。 通过公众号&#x…

Linux网络编程(一) 网络基础

一、一些概念 1.1、局域网与广域网 局域网&#xff1a;局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。广域网&#xff1a;又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。 1.2、IP IP地址本质就是…

线性表--数据结构设计与操作

单链表 1.单链表的定义&#xff1a; typedef struct LNode{Elemtype data;struct Lnode *next; }LNode ,*LinkList;//单链表的数据结构&#xff08;手写&#xff09; #include<iostream> #include<vector> #include<algorithm>typedef int TypeElem; //单链表…

一起刷C语言菜鸟教程100题(15-26含解析)

五一过的好快&#xff0c;五天假期说没就没&#xff0c;因为一些事情耽搁到现在&#xff0c;不过还是要继续学习的&#xff0c;之后就照常更新&#xff0c;先说一下&#xff0c;这个100题是菜鸟教程里面的&#xff0c;但是有一些题&#xff0c;我加入了自己的理解&#xff0c;甚…