Spring Bean生命周期(4大阶段图解)

Spring Bean生命周期(4大阶段图解)-mikechen

在 Spring Bean 的生命周期可以分为四个阶段,下面我就来分别详解Spring Bean生命周期@mikechen

1.实例化阶段

这个阶段主要是实例化 Bean 对象,使用 Bean 的构造函数或者工厂方法来实例化 Bean 对象。

首先当 Spring 容器启动时,会按照配置文件中定义的 Bean 信息,通过反射机制实例化每一个 Bean 对象,即调用它的构造方法来创建一个新的实例。

如下图所示:

Spring Bean生命周期(4大阶段图解)-mikechen

源码所示:

// 创建 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 配置文件、注解等方式来实现。

如下图所示:

Spring Bean生命周期(4大阶段图解)-mikechen

源码所示:

// 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 的初始化方法。

如下图所示:

Spring Bean生命周期(4大阶段图解)-mikechen

源码所示:

// 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() 方法进行清理工作。

 

Spring Bean生命周期(4大阶段图解)-mikechen

在这个阶段,容器会调用实现了 DisposableBean 接口的 destroy() 方法和在 XML 中通过 destroy-method 属性指定的方法来销毁 Bean 对象,释放占用的资源。

以上就是spring中bean的生命周期详解,更多Spring内容请查看:Spring教程(史上最全图文详解)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法