Spring Bean的生命周期

本文详细阐述了SpringBean的生命周期,从实例化、依赖注入,到Bean的初始化、使用和销毁过程。涉及的关键环节包括Aware接口、BeanPostProcessor、初始化方法及销毁方法的调用。了解这一过程对于优化Spring应用的性能和管理Bean的状态至关重要。
摘要由CSDN通过智能技术生成

一、生命周期

生命周期的大致过程如下图所示:
一阶段:Bean的实例化和DI(dependency injection)
二阶段:检查Spring Awareness
三阶段:创建bean生命周期回调
四阶段:销毁bean生命周期回调
在这里插入图片描述

二、面试回答

1、实例化一个Bean--也就是我们常说的new;

2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入,也就是对Bean的属性进行赋值;

3、检查Bean实现的Aware相关接口
   1)如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值
   2)如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
   3)如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

4、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

5、如果Bean实现了InitializingBean这个接口,会调用其实现的init()方法;

6、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

7、如果这个Bean关联了BeanPostProcessor接口,将会调用**postProcessAfterInitialization(Object obj, String s)**方法;

注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

8、使用

9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的**destroy()**方法;

10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

三、面试回答(二)

spring bean加载的过程主要就是执行AbstractApplicationContext类中的refresh方法。

首先对初始化进行同步处理,防止同时有多线程处理加载,然后就是对上下文进行初始化。

👉Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化

👉Bean实例化后对将Bean的引入和值注入到Bean的属性中

👉如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法

👉如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入

👉如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

👉如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。

👉如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。

类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

👉如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

👉此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

👉如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值