一、概述
-
在Spring中,Bean的生命周期可以大致分为以下四个阶段:
- 实例化阶段
- 初始化阶段
- 使用Bean
- 销毁Bean
-
Spring中Bean的生命周期整体流程图如下:
二、生命周期中的四个阶段
1. 实例化阶段
实例化就是用来给Bean对象分配内存空间,但此时的Bean的属性值是默认值。
关于BeanDefinition?
BeanDefinition在Spring中是用来描述bean实例的所有信息,比如:属性值、构造器参数以及其他信息。Bean对象创建是根据BeanDefinition中描述的信息来创建的。
2. 初始化阶段
-
属性赋值
在Spring中Bean对象的属性赋值分为两种:自定义的属性赋值和引用的容器对象属性赋值
-
自定义的属性赋值
自定义的属性赋值会通过set方法完成赋值
-
引用的容器对象属性赋值
在对引用的容器对象赋值时,Spring容器会去检测该Bean对象是否实现了
×××Aware
接口,如果实现了就会将对应的×××Aware
示例注入给Bean对象。比如该Bean对象实现了BeanFactoryAware
接口,那么Spring容器就会调用Bean对象实现的setBeanFactory()
方法将BeanFactory
对象注入给Bean对象。当然了,也可以使用注解方式
完成引用的容器对象注入,如:@Inject
、@AutoWired
关于Aware接口?
Aware接口是一个空接口,只是起到一个标识作用,它具体的实现由子接口的实现类去决定的。如:BeanFactoryAware接口。当我们自定义的Bean中的属性有BeanFactory时,只需实现BeanFactoryAware接口和对应的setBeanFactory方法,Spring容器就会自动为Bean对象注入BeanFactory属性。
这个步骤对应了
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
类中的invokeAwareMethods()
方法private void invokeAwareMethods(String beanName, Object bean) { if (bean instanceof Aware) { if (bean instanceof BeanNameAware) { ((BeanNameAware)bean).setBeanName(beanName); } if (bean instanceof BeanClassLoaderAware) { ClassLoader bcl = this.getBeanClassLoader(); if (bcl != null) { ((BeanClassLoaderAware)bean).setBeanClassLoader(bcl); } } if (bean instanceof BeanFactoryAware) { ((BeanFactoryAware)bean).setBeanFactory(this); } } }
-
-
Bean的增强实现
到这里,一个普通的Java对象就已经创建完毕了。但是对于Spring来说,它会考虑到对象的扩展功能,所以会对Bean对象做一系列的增强实现操作。在增强实现中,具体可分为三个步骤,这三个步骤都归属于一个叫做
BeanPostProcessor
的接口。-
前置处理方法
-
执行初始化方法
初始化方法在Bean的属性设置完成后被调用,用于执行一些自定义的初始化逻辑。
-
后置处理方法
该方法可以用于对Bean进行进一步的修改或处理,比如判断Bean是否需要进行
AOP
的增强操作,AOP
就是在这个步骤中被执行的。
-
3. 使用Bean
在初始化完成后,Bean就可以被应用程序使用了。它可以被注入到其他Bean中,或者通过Spring容器获取并调用其方法。
3. 销毁Bean
当应用程序关闭或不再需要某个Bean时,Spring容器会销毁该Bean。销毁时会调用Bean的销毁方法(如果有定义的话)。可以通过实现DisposableBean
接口、使用@PreDestroy
注解或在配置文件中配置destroy-method
来指定销毁方法。