学习java第六十五天

Spring中Bean的生命周期可以细分为以下几个阶段,并在每个阶段提供了相应的扩展点:

实例化(Instantiation): Spring IoC容器根据BeanDefinition创建Bean实例。

扩展点:在实际实例化之前,可以通过实现org.springframework.beans.factory.config.BeanFactoryPostProcessor接口对BeanDefinition进行修改。但这个阶段并不能直接操作Bean实例。

预初始化(Pre-Initialization) Bean实例被创建后,但在其初始化方法调用前,Spring允许通过BeanPostProcessor接口进行干预。

扩展点:org.springframework.beans.factory.config.BeanPostProcessor接口中的postProcessBeforeInitialization(Object bean, String beanName)方法,可以在所有Bean初始化前执行自定义逻辑。

初始化(Initialization):如果Bean实现了InitializingBean接口,那么会调用其afterPropertiesSet()方法。如果为Bean定义了init-method属性,那么Spring会在完成依赖注入后调用指定的方法。

扩展点:通过实现InitializingBean接口或声明init-method来自定义初始化逻辑。

运行时(Runtime)

在初始化完成后,Bean进入可用状态,应用程序代码可以从IoC容器中获取并使用这些Bean。

销毁前(Pre-Destruction)当Spring容器关闭或者需要销毁某个Bean时,Spring会先调用DisposableBean接口的destroy()方法。

同样地,如果为Bean定义了destroy-method属性,那么也会在销毁阶段调用此方法。

扩展点:

通过实现DisposableBean接口或声明destroy-method来定义Bean销毁前释放资源或其他清理工作。

销毁(Destruction)

完成销毁前的所有回调后,Bean将从Spring容器中移除,结束其生命周期。

Spring通过其IoC容器和三级缓存机制来解决单例Bean之间的循环依赖问题。

在创建Bean的过程中,Spring将Bean的实例化、属性填充、初始化等步骤分离开来,并在这些步骤之间维护了三个缓存:

初始化(Early singleton instantiation):当检测到一个Bean正在被创建时,会提前创建该Bean的一个早期引用对象并放入缓存中。

单例池(Singleton Factories):存放已经完成实例化但未进行属性注入的Bean工厂对象。

完全初始化(Prototype Factories or eagerly initialized singletons):针对特定情况如原型Bean或某些特殊场景下的单例Bean,存储完全初始化好的Bean实例。

当两个或多个单例Bean互相依赖时,Spring容器首先会尝试从缓存中获取Bean的早期引用或者工厂对象,如果能够获取到,则可以继续进行依赖注入,从而避免死锁和栈溢出等问题。对于多例作用域的Bean,Spring默认不支持循环依赖。

相关推荐
灯澜忆梦4 分钟前
【Linux】#5 | 文件与目录基础操作命令
java·linux·运维
字节跳动的猫7 分钟前
LikeShop 搜索功能优化二开:中文分词、商品权重排序与搜索热词管理
android·java·中文分词
计算机毕设定制辅导-无忧学长7 分钟前
《基于微信小程序的校园文化活动报名与管理系统》
java·spring boot·微信小程序·uniapp·校园文化活动报名与管理小程序
靠沿11 分钟前
MySQL数据库基础——索引的使用&alter、explain关键字
java·数据库·mysql
96245611 分钟前
餐饮 SaaS 优惠券系统架构演进(七)营销定价引擎设计:活动、会员价、优惠券、买赠如何在同一 PriceQuote 中可解释地组合
java·运维·算法
码匠许师傅16 分钟前
【C++三方组件】redis-plus-plus:现代 Redis C++ 客户端
java·c++·redis
ab12376818 分钟前
MQTT笔记
java·笔记·mqtt·学习
二宝哥23 分钟前
【问题】代理转发到后端使用request.getRequestURL()地址没有端口
java
霸道流氓气质27 分钟前
HashiCorp Vault 与云 KMS 入门实战:动态密钥、SecretLeaseContainer 与 Java 集成完整指南
java·开发语言
wuminyu30 分钟前
stackChunkOop内部结构与GC屏障的配合工作原理剖析
java·linux·c语言·jvm·c++