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

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

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

1.实例化阶段

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

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

如下图所示:

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

源码所示:

  1. // 创建 Bean 实例
  2. protected <T> T doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) {
  3. // 实例化 Bean
  4. BeanWrapper instanceWrapper = null;
  5. if (mbd.isSingleton()) {
  6. instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
  7. }
  8. if (instanceWrapper == null) {
  9. instanceWrapper = createBeanInstance(beanName, mbd, args);
  10. }

 

备注:这个阶段 Bean 对象还没有被初始化。

 

 

2.属性赋值阶段

在属性赋值阶段,Spring 会为 Bean 的属性赋值,这个阶段可以通过注入 Bean 的属性来实现,也可以使用 XML 配置文件、注解等方式来实现。

如下图所示:

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

源码所示:

  1. // XML 配置文件方式
  2. public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable {
  3. // Bean 属性
  4. private final MutablePropertyValues propertyValues = new MutablePropertyValues();
  5.  
  6. public void setPropertyValues(PropertyValues propertyValues) {
  7. this.propertyValues.clear();
  8. if (propertyValues != null) {
  9. this.propertyValues.addPropertyValues(propertyValues);
  10. }
  11. }
  12. }
  13.  
  14. // 注解方式
  15. public interface Autowired {
  16. boolean required() default true;
  17. }
  18.  
  19. @Autowired(required = true)
  20. private UserDao userDao;

 

 

3.初始化阶段

在这个阶段,Spring 会调用 Bean 的初始化方法,Bean 的初始化方法可以通过配置文件中的 init-method 属性或者实现 InitializingBean 接口来定义。

  • InitializingBean 接口:可以让 Bean 实现 InitializingBean 接口,并实现 afterPropertiesSet() 方法来执行初始化操作。
  • init-method 属性:可以通过配置文件中的 init-method 属性来指定 Bean 的初始化方法。

如下图所示:

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

源码所示:

  1. // InitializingBean 接口方式
  2. public interface InitializingBean {
  3. void afterPropertiesSet() throws Exception;
  4. }
  5.  
  6. // 调用 InitializingBean 的 afterPropertiesSet 方法
  7. protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable {
  8. boolean isInitializingBean = (bean instanceof InitializingBean);
  9. if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
  10. ((InitializingBean)

 

4.销毁阶段

当容器关闭或者 ApplicationContext 被销毁时,容器会调用 Bean 的 destroy() 方法进行清理工作。

 

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

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

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

评论交流
    说说你的看法
欢迎您,新朋友,感谢参与互动!