Bean的生命周期详解(8大阶段)

Bean的生命周期详解(8大阶段)-mikechen

Bean的生命周期经常在Spring面试中被考察,下面详解具体bean生命周期的8大阶段@mikechen

1.实例化(Instantiation)

在这个阶段,Spring容器根据配置文件或注解,通过调用bean类的构造函数来创建bean的实例,这是bean生命周期的起始点。

实例化可以通过以下方式完成:

  • 构造函数实例化: Spring容器调用bean类的构造函数来创建实例,这通常是默认的实例化方式。
  • 静态工厂方法实例化: 如果bean配置了静态工厂方法,Spring将调用该方法来获取实例。

在实例化阶段,还没有注入任何属性值或执行其他的初始化操作,实例化完成后,bean实例处于“原始”状态,没有任何属性被设置。

 

2.属性赋值(Populate properties)

一旦bean实例化完成,Spring容器会根据配置文件或注解,自动将属性值注入到bean实例中。

属性注入可以通过以下几种方式实现:

  • Setter方法注入: Spring容器会查找bean中的setter方法,然后调用这些方法并传递相应的属性值。
  • 字段注入: Spring容器会直接设置bean中声明的字段,并为其赋予相应的属性值。
  • 构造函数注入: 如果使用构造函数注入,属性值会通过构造函数参数传递到bean实例中。

在属性注入阶段,Spring容器将已实例化的bean与所需的属性值进行关联。

此时,bean的实例已经包含了属性值,但还没有执行任何初始化方法。

 

3.初始化(Initialization)

在属性注入完成后,如果bean实现了InitializingBean接口或配置了初始化方法(通过init-method属性),Spring容器会调用这个方法。

在这个方法中,你可以执行一些自定义的初始化操作。

 

4.后置处理器的前置处理

在bean初始化之前,Spring容器会调用注册的所有后置处理器的postProcessBeforeInitialization方法,这允许开发者在bean初始化之前进行一些自定义的处理。

如下所示:

Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

这个方法允许你在bean的初始化之前进行一些修改或增强操作。

 

5.初始化完成

初始化方法执行完成后,bean已经完全初始化,可以在应用程序中使用了。

 

6.后置处理器的后置处理

在bean初始化完成后,Spring容器会调用注册的所有后置处理器的postProcessAfterInitialization方法。

示例如下:

Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

这个方法允许你在bean的初始化之后进行一些修改或增强操作,比如:

  • 为bean添加额外的功能,如日志记录、性能监控等;
  • 对bean进行代理,以实现AOP(面向切面编程);
  • 检查bean的状态或执行其他校验操作;

 

7.使用(Using)

初始化完成后,bean可以被应用程序中的其他组件使用。在这个阶段,bean执行它的正常业务逻辑。

 

8.销毁(Destruction)

当Spring容器关闭时,它会调用bean的销毁方法,这可以通过实现DisposableBean接口或配置销毁方法来实现。

在销毁方法中,可以执行一些清理操作,如释放资源、关闭连接等。

Bean的生命周期最后就变成下图了:

Bean的生命周期详解(8大阶段)-mikechen

作者简介

陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

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

评论交流
    说说你的看法