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属性,会自动调用其配置的自定义销毁方法