当前位置: 首页>编程语言>正文

Spring中Bean的生命周期

一、概述

  • 在Spring中,Bean的生命周期可以大致分为以下四个阶段:

    • 实例化阶段
    • 初始化阶段
    • 使用Bean
    • 销毁Bean
  • Spring中Bean的生命周期整体流程图如下:

    Spring中Bean的生命周期,第1张

二、生命周期中的四个阶段

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来指定销毁方法。


https://www.xamrdz.com/lan/5ks1960774.html

相关文章: