对于普通的 Java 对象,当 new 的时候创建对象,然后该对象就能够使用了。一旦该对象不再被使用,则由 Java 自动进行垃圾回收。
Spring 中的实体类对象是 bean,bean 和普通的 Java 对象没啥大的区别,只不过 Spring 不再自己去 new 对象了,而是由IOC容器去帮助我们实例化对象并且管理它,我们需要哪个对象,去问IOC容器要即可。IOC就是解决对象之间的耦合问题,Spring Bean 的生命周期完全由容器控制。
BeanDefinition和Bean的关系:
- BeanDefinition是Bean的元数据,它是扫描配置文件加载的关于Bean的信息,封装成为BeanDifinition对象
- Bean,是IOC容器管理的实例化对象,由BeanDefinition属性创建Bean
Bean的创建过程:
- 容器扫描<bean>标签封装BeanDefinition对象
- 通过BeanDefinition的属性信息实例化生成Bean对象
bean的生命周期:
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
关于Bean的创建流程参考下图:
bean自身方法的生命周期:
分为四步:
1、实例化
- 读取spring配置文件相关标签封装生成BeanDefinition对象
- 通过反射进行bean的实例化(此时的Bean是空对象信息)
2、属性赋值
- 解析BeanDefinition的属性(beanName、beanType等)并赋值,DI在此处体现
- 如果Bean对象里的属性需要引用容器内部的对象,那么需要调用aware接口的子类方法进行统一设置
- 循环依赖
3、初始化
- 调用XXXAware回调方法
- 调用初始化生命周期回调
- 如果bean实现aop创建动态代理
4、销毁
- 在spring容器关闭的时候进行调用
- 调用初始化生命周期回调
对应上述文字,下图展示了bean装载到spring应用上下文种的一个典型的生命周期过程