Spring Bean生命周期

#Bean #Spring

Bean 的生命流程简述

  1. Instantitaion
  2. populate
  3. Initialization
  4. 使用
  5. 结束销毁

Instantiation

什么是 Instatiation? 他和 populate 有什么区别?

Spring 的 Bean 创建是控制反转(IoC)的核心体现。容器根据 BeanDefinition 中的元数据(如类名、作用域、构造参数、工厂方法、初始化/销毁方法等),通过 Java 反射机制来实例化 Bean 对象。 这个阶段只是‘创建空壳对象’,尚未进行依赖注入。 后续 Spring 会基于同样的 BeanDefinition 完成 属性填充(即依赖注入)和初始化,最终将一个完整可用的 Bean 交还给应用。 通过这种方式,对象的创建和依赖管理不再由程序员手动控制(比如 new),而是交给了 Spring 容器,实现了控制反转。

三种创建对象的方法

  1. Supplier
  2. 工厂方法
  3. 构造函数
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
   //检查获取 BeanDefinition
   Class<?> beanClass = resolveBeanClass(mbd, beanName);

   //首先检查是否提供了 Supplier,如果有就直接返回创建对象
   Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
   if (instanceSupplier != null) {
      return obtainFromSupplier(instanceSupplier, beanName);
   }

   
   //检查是否有工厂方法
   if (mbd.getFactoryMethodName() != null) {
      return instantiateUsingFactoryMethod(beanName, mbd, args);
   }
   
   
   //执行后置处理器, 获取候选构造方法
   Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
   
   if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
         mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
      return autowireConstructor(beanName, mbd, ctors, args);
   }

   
   return instantiateBean(beanName, mbd);
}

populate

populate 在做什么?

popluate 流程主要是将属性注入到上一步创建好的“空壳对象”,核心是对对象中有 [[@Autowired]] 和 @Resource 的字段 Setter 函数等注入属性,完成这一步后会进行 Initialization 进行 AOP 代理、回调 Aware 接口、回调初始化方法。

属性填充的核心流程

  1. 读取 BeanDefinition
    Spring 查看这个 Bean 的 PropertyValues(属性值元数据)
  2. 解析依赖来源
    • 如果依赖来源于其他 Bean,那么递归先去创建该 Bean(如果成环这里就可能诞生 [[依赖循环]]依赖循环的问题)
    • 如果来源于配置文件,则从 Environment 中读取
  3. 通过反射赋值
    • [[Spring/@AutoWired.md|@AutoWired ]]注入(构造器注入已经在 Instantiation 阶段完成)
    • @Resource 注入

Initalization

Aware BeanPostProcessor invokeInitMethods() BeanPostFactory.postProcessAfterInitialization()

步骤 名称 作用 代码体现 具体效果
4 BeanPostProcessor 前置处理 在初始化方法执行前,允许你对 Bean 做预处理 postProcessBeforeInitialization 打印日志,告诉开发者“Bean 即将初始化”,可用于权限检查、日志埋点等。
5 是否实现 InitializingBean Spring 提供的标准初始化回调接口 afterPropertiesSet() 在这里做数据校验(如用户名不能为空),确保 Bean 状态合法。
6 是否配置自定义 init-method 用户自定义的初始化方法 myInitMethod() 在这里做业务初始化(如加载缓存、连接数据库),非常灵活。
7 BeanPostProcessor 后置处理 在所有初始化完成后,对 Bean 进行最终处理或包装 postProcessAfterInitialization 关键效果:返回一个代理对象!这使得你可以无侵入地给 Bean 添加功能(如事务、日志、安全检查),这就是 AOP 的基础。

! [[../pics/SpringBean.png]]


Destruction

当容器关闭时会调用

  • DisposableBean.destroy()
  • destory-method() 与初始化阶段的 InitializingBean.afterPropertiesSet()init_method 对称

总结:Destruction 的核心要点

要点 说明
两个钩子 DisposableBean.destroy() + destroy-method
执行顺序 @PreDestroydestroy()destroy-method
触发条件 必须调用 context.close()
为什么重要 防止 资源泄漏(数据库连接、线程池、文件句柄等)
最佳实践 @PreDestroy 注解方法,清晰且解耦

Reference

title: "聊透Spring bean的生命周期一步一图带你理解Spring bean的生命周期,清楚Spring的IOC、DI、A - 掘金"
image: "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1960950d22104a639e09de10d2bff105~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?"
description: "一步一图带你理解Spring bean的生命周期,清楚Spring的IOC、DI、AOP是怎么完成的,并教你如何借助Bean的生命周期,拓展你的应用"
url: "https://juejin.cn/post/7155884227714613285"
favicon: ""
aspectRatio: "24.867724867724867"
title: "聊透Spring依赖注入依赖自动注入;依赖注入模型;[[@AutoWired]]和@Resource依赖注入的解析、超找、注入流 - 掘金"
image: "https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9f2a1a92368a44c8bfb343fc864a7a52~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?"
description: "依赖自动注入;依赖注入模型;@AutoWired和@Resource依赖注入的解析、超找、注入流程分析;@Qualifier实现名称查找的原理分析"
url: "https://juejin.cn/post/7143419261657022472"
favicon: ""
aspectRatio: "42.28310502283105"