
在 Spring Bean 的生命周期可以分为四个阶段,下面我就来分别详解Spring Bean生命周期@mikechen
1.实例化阶段
这个阶段主要是实例化 Bean 对象,使用 Bean 的构造函数或者工厂方法来实例化 Bean 对象。
首先当 Spring 容器启动时,会按照配置文件中定义的 Bean 信息,通过反射机制实例化每一个 Bean 对象,即调用它的构造方法来创建一个新的实例。
如下图所示:

源码所示:
// 创建 Bean 实例
protected <T> T doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) {
// 实例化 Bean
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
备注:这个阶段 Bean 对象还没有被初始化。
2.属性赋值阶段
在属性赋值阶段,Spring 会为 Bean 的属性赋值,这个阶段可以通过注入 Bean 的属性来实现,也可以使用 XML 配置文件、注解等方式来实现。
如下图所示:

源码所示:
// XML 配置文件方式
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable {
// Bean 属性
private final MutablePropertyValues propertyValues = new MutablePropertyValues();
public void setPropertyValues(PropertyValues propertyValues) {
this.propertyValues.clear();
if (propertyValues != null) {
this.propertyValues.addPropertyValues(propertyValues);
}
}
}
// 注解方式
public interface Autowired {
boolean required() default true;
}
@Autowired(required = true)
private UserDao userDao;
3.初始化阶段
在这个阶段,Spring 会调用 Bean 的初始化方法,Bean 的初始化方法可以通过配置文件中的 init-method 属性或者实现 InitializingBean 接口来定义。
- InitializingBean 接口:可以让 Bean 实现 InitializingBean 接口,并实现 afterPropertiesSet() 方法来执行初始化操作。
- init-method 属性:可以通过配置文件中的 init-method 属性来指定 Bean 的初始化方法。
如下图所示:

源码所示:
// InitializingBean 接口方式
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
// 调用 InitializingBean 的 afterPropertiesSet 方法
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable {
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
((InitializingBean)
4.销毁阶段
当容器关闭或者 ApplicationContext 被销毁时,容器会调用 Bean 的 destroy() 方法进行清理工作。

在这个阶段,容器会调用实现了 DisposableBean 接口的 destroy() 方法和在 XML 中通过 destroy-method 属性指定的方法来销毁 Bean 对象,释放占用的资源。
以上就是spring中bean的生命周期详解,更多Spring内容请查看:Spring教程(史上最全图文详解)
mikechen睿哥
10年+一线大厂架构实战经验,就职于阿里、百度等一线大厂,操盘多个亿级大厂核心项目。