SpringBean生命周期

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Spring 容器可以管理 singleton 作用域 Bean 的生命周期在此作用域下Spring 能够精确地知道该 Bean 何时被创建何时初始化完成以及何时被销毁。

而对于 prototype 作用域的 BeanSpring 只负责创建当容器创建了 Bean 的实例后Bean 的实例就交给客户端代码管理Spring 容器将不再跟踪其生命周期。每次客户端请求 prototype 作用域的 Bean 时Spring 容器都会创建一个新的实例并且不会管那些被配置成 prototype 作用域的 Bean 的生命周期。

了解 Spring 生命周期的意义就在于可以利用 Bean 在其存活期间的指定时刻完成一些相关操作。这种时刻可能有很多但一般情况下会在 Bean 被初始化后和被销毁前执行一些相关操作。

Spring Bean生命周期流程

在 Spring 中Bean 的生命周期是一个很复杂的执行过程我们可以利用 Spring 提供的方法定制 Bean 的创建过程。

Spring 容器中 Bean 的生命周期流程

  • 如果 BeanFactoryPostProcessor 和 Bean 关联, 则调用postProcessBeanFactory方法.(即首先尝试从Bean工厂中获取Bean)
  • 如果 InstantiationAwareBeanPostProcessor 和 Bean 关联则调用postProcessBeforeInstantiation方法
  • 根据配置情况调用 Bean 构造方法实例化 Bean。
  • 利用依赖注入完成 Bean 中所有属性值的配置注入。
  • 如果 InstantiationAwareBeanPostProcessor 和 Bean 关联则调用postProcessAfterInstantiation方法和postProcessProperties
  • 调用xxxAware接口 (上图只是给了几个例子)
    • 第一类Aware接口
      • 如果 Bean 实现了 BeanNameAware 接口则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
      • 如果 Bean 实现了 BeanClassLoaderAware 接口则 Spring 调用 setBeanClassLoader() 方法传入classLoader的引用。
      • 如果 Bean 实现了 BeanFactoryAware 接口则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。
    • 第二类Aware接口
      • 如果 Bean 实现了 EnvironmentAware 接口则 Spring 调用 setEnvironment() 方法传入当前 Environment 实例的引用。
      • 如果 Bean 实现了 EmbeddedValueResolverAware 接口则 Spring 调用 setEmbeddedValueResolver() 方法传入当前 StringValueResolver 实例的引用。
      • 如果 Bean 实现了 ApplicationContextAware 接口则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。
  • 如果 BeanPostProcessor 和 Bean 关联则 Spring 将调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作此处非常重要Spring 的 AOP 就是利用它实现的。
  • 如果 Bean 实现了 InitializingBean 接口则 Spring 将调用 afterPropertiesSet() 方法。(或者有执行@PostConstruct注解的方法)
  • 如果在配置文件中通过 init-method 属性指定了初始化方法则调用该初始化方法。
  • 如果 BeanPostProcessor 和 Bean 关联则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。此时Bean 已经可以被应用系统使用了。
  • 如果在 <bean> 中指定了该 Bean 的作用范围为 scope="singleton"则将该 Bean 放入 Spring IoC 的缓存池中将触发 Spring 对该 Bean 的生命周期管理如果在 <bean> 中指定了该 Bean 的作用范围为 scope="prototype"则将该 Bean 交给调用者调用者管理该 Bean 的生命周期Spring 不再管理该 Bean。
  • 如果 Bean 实现了 DisposableBean 接口则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁(或者有执行@PreDestroy注解的方法)
  • 如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法则 Spring 将调用该方法对 Bean 进行销毁。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring