Spring Bean的生命周期

SpringBean的生命周期从实例化到存储在单例池中,包括BeanDefinition的解析、属性填充、初始化和销毁等阶段。在实例化过程中,处理单例、延迟加载、FactoryBean等情况,并通过反射设置属性。初始化阶段涉及Aware接口、BeanPostProcessor和自定义初始化方法。销毁时可执行DisposableBean或自定义销毁方法。
摘要由CSDN通过智能技术生成

Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。

Bean 实例化的基本流程

加载xml配置文件,解析获取配置中的信息,封装成BeanDefifinition对象;

将BeanDefifinition存储在一个名为beanDefifinitionMap的Map<String,BeanDefifinition>中;

ApplicationContext底层遍历beanDefifinitionMap,创建Bean实例对象;

创建好的Bean实例对象,被存储到一个名为singletonObjects的Map<String,Object>中;

当执行applicationContext.getBean(beanName)时,从singletonObjects去匹配Bean实例返回

Bean实例化阶段:

spring框架取出BeanDefinition的信息进行判断,当前Bean是否是单例(singleton),是否是延迟加载的,是否是工厂Bean(FactoryBean),最终将一个普通的singleton的Bean通过反射进行实例化

Bean属性填充阶段:

根据BeanDefinition中的信息通过属性propertyValues进行存储,

  • 注入普通属性:String,int等基本类型的集合时,直接通过set方法的反射设置进去

  • 注入单向对象引用属性,从容器中getBean获取后通过set方法反射设置进行,如果容器中没有,则先创建被注入对象Bean的实例(完成整个生命周期),在进行注入操作;

  • 注入双向对象引用属性:涉及循环引用

如上图:UserService实例化对象,还未初始化,将UserService存储到三级缓存

UserService属性注入,需要UserDao,从缓存中获取,没有UserDao

UserDao实例化对象,还未初始化,将UserDao存储到三级缓存

UserDao属性注入,需要UserService,从三级缓存获取UserService,UserService从三级缓存移入到二级缓存

UserDao接着往后执行生命周期过程,成为一个完整的Bean,存储到一级缓存,删除二三级缓存

UseService注入UserDao

UserService继续执行生命周期过程,成为一个完整的Bean,存储到一级缓存,删除二三级缓存

Bean初始化阶段:

Aware接口属性注入

BeanPostProcessor的before()方法回调

InitializingBean接口的初始化方法回调

自定义初始化方法init回调

BeanPostProcessor的after()方法回调

Bean销毁阶段:

执行DisposableBean销毁Bean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法执行销毁

执行destroy-method自定义销毁方法:如果这个Bean的spring配置中配置了destroy-method属性,会自动调用其配置的自定义销毁方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值