7、Bean的生命周期

article/2025/8/24 3:20:45

Spring其实就是一个管理Bean对象的工厂。它负责对象的创建,对象的销毁等。

所谓的生命周期就是:对象从创建开始到最终销毁的整个过程。

什么时候创建Bean对象?

创建Bean对象的前后会调用什么方法?

Bean对象什么时候销毁?

Bean对象的销毁前后调用什么方法?

1 Bean的生命周期之5步

Bean生命周期的管理,可以参考Spring的源码:AbstractAutowireCapableBeanFactory类的doCreateBean()方法

Bean生命周期可以粗略的划分为五大步:

  • 第一步:实例化Bean
  • 第二步:Bean属性赋值
  • 第三步:初始化Bean(会调用Beaninit方法。注意:这个init方法需耍自已写,自己配。)
  • 第四步:使用Bean
  • 第五步:销毁Bean(会调用Beandestroy 方法。注意:这个destroy 方法需耍自已写,自己配。)

image.png

public class User {private String name;public User() {System.out.println("第一步:无参数构造方法执行");}public void setName(String name) {System.out.println("第二步:给对象的属性赋值");this.name = name;}//需要自己写,自己配public void initBean() {System.out.println("第三步:初始化Bean");}//需要自己写,自己配public void destroy() {System.out.println("第五步:销毁Bean");}
}

init-method="initBean" destroy-method="destroy"

    <bean id="user" class="com.cjf.bean.User" init-method="initBean" destroy-method="destroy"><property name="name" value="zs"/></bean>
@Test
public void testBeanLifeCycleFive() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springBean.xml");User user = applicationContext.getBean("user", User.class);System.out.println("第四步:使用Bean: " + user);//注意:必须手动关闭Spring容器,才会销毁BeanClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;context.close();
}

image-20221109212931393


2 Bean生命周期之7步

在以上的5步中,第3步是初始化Bean,如果你还想在初始化前和初始化后添加代码,可以加入“Bean后处理器”。

编写一个类实现BeanPostProcessor类,并且重写beforeafter方法:

  • 第一步:实例化Bean

  • 第二步:Bean属性赋值

  • 第三步:执行“Bean后处理器”的before方法

  • 第四步:初始化Bean(会调用Bean 的init方法。注意:这个init方法需耍自已写,自己配。)

  • 第五步:执行“Bean后处理器”的after方法

  • 第六步:使用Bean

  • 第七步:销毁Bean(会调用Bean的destroy 方法。注意:这个destroy 方法需耍自已写,自己配。)

image.png

测试类

@Test
public void testBeanLifeCycleFive() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springBean.xml");User user = applicationContext.getBean("user", User.class);System.out.println("第六步:使用Bean: " + user);//注意:必须手动关闭Spring容器,才会销毁BeanClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;context.close();
}

LogBeanPostProcessor

public class LogBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("执行Bean后处理器的before方法");return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("执行Bean后处理器的after方法");return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}
}

SpringBean.xml

<!--配置Bean后处理器-->
<!--注意:这个Bean后处理器将作用于整个配置文件所有的bean-->
<bean class="com.cjf.bean.LogBeanPostProcessor"/>
<bean id="user" class="com.cjf.bean.User" init-method="initBean" destroy-method="destroy"><property name="name" value="zs"/>
</bean>

image-20221109214100707


源码分析

3 Bean生命周期之10步

点位:

  • 在“Bean后处理器”before方法之

    • 检查Bean是否实现类Aware相关的接口,若实现了则调用这些接口中的方法
    • 然后调用这些方法的目的是为了给你传递一些数据,让你更加方便使用。
  • 在“Bean后处理器”before方法之

    • 检查Bean是否实现 InitializingBean
  • 使用Bean之后,或者在销毁Bean之前

    • 检查Bean是否实现 DisposableBean
  • 添加的这三个点位的特点。都是在检查你这个Bean是否实现了某些特定的接口,如果实现了这些接口,则Spring容器会调用这个接口中的方法。

如果根据源码跟踪,可以划分更细粒度的步骤,10步:

image.png

是否实现了Aware的相关接口是什么意思?

Aware相关的接口包括:BeanNameAwareBeanClassLoaderAwareBeanFactoryAware

  • 当Bean实现了BeanNameAware,Spring会将Bean的名字传递给Bean。
  • 当Bean实现了BeanClassLoaderAware,Spring会将加载该Bean的类加载器传递给Bean。
  • 当Bean实现了BeanFactoryAware,Spring会将Bean工厂对象传递给Bean。

image-20221109220249586

public class User implements InitializingBean,DisposableBean, BeanNameAware, BeanClassLoaderAware, BeanFactoryAware {private String name;public User() {System.out.println("第一步:无参数构造方法执行");}public void setName(String name) {System.out.println("第二步:给对象的属性赋值");this.name = name;}//需要自己写,自己配public void initBean() {System.out.println("第四步:初始化Bean");}//需要自己写,自己配public void myDestroy() {System.out.println("第七步:销毁Bean");}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("Bean这个类的加载器: " + classLoader);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("生产Bean的工厂是: " + beanFactory);}@Overridepublic void setBeanName(String s) {System.out.println("Bean的名字: " + s);}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean 的 afterPropertiesSet 方法执行");}@Overridepublic void destroy() throws Exception {System.out.println("DisposableBean 的 destroy 方法执行");}
}

http://chatgpt.dhexx.cn/article/mYgeS32R.shtml

相关文章

【一篇搞懂】 bean的生命周期详解

概述 Spring中的一个Bean从生到灭要经历很多过程,总体分为Bean定义、实例化、属性赋值(依赖注入)、初始化、生存期、销毁几个阶段: ​​​​​​​​ 下面是一个细化的Bean生命周期图: 过程比较复杂,重点关注Bean的定义、初始化、销毁过程,可以抓住重点: BeanPostPro…

Bean 生命周期详解

Spring Bean 的生命周期&#xff0c;面试时非常容易问&#xff0c;这不&#xff0c;前段时间就有个粉丝去字节面试&#xff0c;因为不会回答这个问题&#xff0c;一面都没有过。 如果只讲基础知识&#xff0c;感觉和网上大多数文章没有区别&#xff0c;但是我又想写得稍微深入…

【Spring】Spring的Bean的生命周期

作者简介&#xff1a;大家好&#xff0c;我是五度鱼&#xff0c;一个普通的Java领域博主&#xff0c;不停输出Java技术博客和干货。座右铭&#xff1a;锲而不舍&#xff0c;金石可镂。个人主页&#xff1a;五度鱼学Java的主页 文章目录 前言1. 什么是Bean的生命周期&#xff1f…

Spring中bean的生命周期(最详细)

Spring Bean的生命周期是Spring面试热点问题。Spring Bean的生命周期指的是从一个普通的Java类变成Bean的过程&#xff0c;深知Spring源码的人都知道这个给面试官讲的话大可讲30分钟以上&#xff0c;如果你不没有学习过Spring的源码&#xff0c;可能就知道Aware接口和调用init方…

Bean的生命周期

目录 一&#xff0c;bean的初始化 &#xff08;1&#xff09;Spring的IOC和AOP&#xff1a; &#xff08;2&#xff09;Spring Bean的生命周期&#xff1a; 二&#xff0c;单例模式与多例模式的区别 区别 《代码演示》 前言 回顾&#xff1a;Servlet的生命 初始化&#x…

bean的生命周期(最全最细讲解)

一、bean生命周期&#xff1a; 其定义为&#xff1a;从对象的创建到销毁的过程。而Spring中的一个Bean从开始到结束经历很多过程&#xff0c;但总体可以分为六个阶段Bean定义、实例化、属性赋值、初始化、生存期、销毁。 二、案例代码演示 1.首先我们来创建一个包&#xff0…

去字节面试,直接让人出门左拐:Bean 生命周期都不知道!

Spring Bean 的生命周期&#xff0c;面试时非常容易问&#xff0c;这不&#xff0c;前段时间就有个粉丝去字节面试&#xff0c;因为不会回答这个问题&#xff0c;一面都没有过。 如果只讲基础知识&#xff0c;感觉和网上大多数文章没有区别&#xff0c;但是我又想写得稍微深入…

Spring Bean生命周期,好像人的一生。。

大家好&#xff0c;我是老三&#xff0c;上节我们手撸了一个简单的IOC容器五分钟&#xff0c;手撸一个Spring容器&#xff01;&#xff0c;这节我们来看一看Spring中Bean的生命周期&#xff0c;我发现&#xff0c;和人的一生真的很像。 简单说说IoC和Bean IoC&#xff0c;控制…

Spring中bean的生命周期

Spring中的bean的生命周期主要包含四个阶段&#xff1a;实例化Bean --&#xff1e; Bean属性填充 --&#xff1e; 初始化Bean --&#xff1e;销毁Bean 首先是实例化Bean&#xff0c;当客户向容器请求一个尚未初始化的bean时&#xff0c;或初始化bean的时候需要注入另一个尚末初…

一文读懂 Spring Bean 的生命周期

欢迎大家关注我的微信公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 一、前言 今天我们来说一说 Spring Bean 的生命周期&#xff0c;小伙伴们应该在面试中经常遇到&#xff0c;这是正常现象。…

ubuntu 换源深层次解析

换源也是一个容易出错的问题&#xff0c;本文以树莓派为例展开&#xff0c;x86也是一样的操作。 那么假设成立的话&#xff0c;就要记住我们是在树莓派&#xff08;arm&#xff09;上安装的ubuntu&#xff0c;不是X86&#xff0c;不是amd。 安装好系统后&#xff0c;我们第一…

[Linux]Ubuntu 换源 20.04 阿里源

注意&#xff0c;这篇文章其实不是简单的教你怎么换源&#xff0c;而是示例一种方法来换20.04的阿里源&#xff0c;其他源和版本大同小异。 笔者在写这篇文章的时候&#xff0c;20.04 还没有release出来正式版&#xff0c;但是已经可以在仓库里看到有源存在了&#xff0c;故写下…

Ubuntu换源详解,教你如何换源,并且解决常见的大坑

Ubuntu换源详解&#xff0c;教你如何换源&#xff0c;并且解决常见的大坑 记一次极不愉快的一次经历 首先注意&#xff0c;换源必须选择合适的版本&#xff0c;不可以在网上找一个下载源就直接去换 出现错误1&#xff1a; 由于没有公钥&#xff0c;无法验证下列签名 :NO_PUBK…

ubuntu 换源

网上应该可以找到很多关于ubuntu源的设置方法&#xff0c;但是如果不搞清楚就随便设置的话&#xff0c;不仅不能起到应有的效果&#xff0c;还会由于一些问题导致apt不可用。 最正确的更换源的方法应该如系统提示的&#xff1a; ## a.) add apt_preserve_sources_list: true …

20.04Ubuntu换源:提升软件下载速度和更新效率

在使用Ubuntu操作系统时&#xff0c;一个常见的优化措施是更改软件源&#xff0c;以提高软件下载速度和更新效率。软件源是指存储软件包的服务器&#xff0c;通过更换软件源&#xff0c;你可以选择更靠近你所在地区的服务器&#xff0c;从而加快软件下载速度&#xff0c;并减少…

Ubuntu快速更换源

Ubuntu更换源&#xff0c;零基础操作 提示&#xff1a;跟着一步步来&#xff0c;很快完成操作 为什么要换源&#xff1f;安装的linux系统默认的源是国外的&#xff0c;当用命令行安装软件&#xff08;比如安装gcc&#xff09;时下载速度非常慢&#xff0c;这里将源换成国内阿里…

Ubuntu系统换源

简单介绍一下源&#xff0c;源就是一个大仓库&#xff08;类似应用商店&#xff09;&#xff0c;系统下载软件需要从这个仓库下载&#xff0c;因为Ubuntu默认源是国外的&#xff0c;所以在下载东西的时候会出现下载速度很慢的情况&#xff0c;所以我们需要更换成国内的源&#…

ubuntu linux 换源,给Ubuntu换源

新手在使用Ubuntu的时候可能在升级时感觉很慢&#xff0c;如果这样他就需要换一个适合自己的源了。 下面我就简单的说一下怎样换源。 在终端里输入 sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup (表示备份列表) 再输入 sudo gedit /etc/apt/sources.list 你就能…

ubuntu换源

ubuntu源 ubuntu换源方法1. 图形界面配置&#xff08;新手推荐&#xff09;2. 手动更改配置文件2.1 命令行替换2.2 手动替换 ubuntu的镜像源阿里源清华源中科大源 ubuntu换源方法 1. 图形界面配置&#xff08;新手推荐&#xff09; 依次打开&#xff1a;系统设置&#xff0c;…

Ubuntu换源的两种方法

Ubuntu系统自带的是国外的源,咱们国内用户使用的时候下载文件特别的慢,所以我们需要更换国内镜像源,这里我列举两个换源的方法,如果有新的方法可以在评论区补充。 首先第一步 我们需要更改root密码 sudo passwd root命令行: 首先备份源 也可以不备份 sudo cp /etc/apt/sou…