Bootstrap

【spring的底层原理】Bean的生命周期

什么是Bean的生命周期

Spring框架中,Bean的生命周期是指一个Spring容器中Bean从创建到销毁的整个过程Spring容器负责管理Bean的生命周期,通过依赖注入和面向切面的编程(AOP)为开发者简化了许多繁琐的操作。Spring框架提供了许多钩子方法,允许开发者在特定阶段执行自定义的逻辑。

Bean的生命周期可以分为几个步骤

Bean的定义阶段

  • Bean元信息配置:定义Bean的配置信息,包括类名、作用域、依赖等。
  • Bean元信息解析:将配置信息解析成Spring内部的BeanDefinition结构。
  • Bean注册:将BeanDefinition注册到Spring容器中。
  • BeanDefinition合并:类似于面向对象中的继承,一个BeanDefinition可以继承另一个BeanDefinition的属性。

加载BeanDefinition中指定的类

Spring框架中,“加载类”通常指的是Spring容器在创建Bean之前,需要先通过类加载器将Bean的类定义加载到JVM中。这是Bean生命周期的第一步,为后续的实例化、属性注入、初始化等步骤提供了基础.

实例化前(可选)

Spring提供了扩展点,允许在Bean实例化前执行一些逻辑。如果实现了InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法,并且返回了非null值,则Spring将不会进行默认的实例化,而是使用返回的对象进行后续操作。

实例化

通过反射机制创建Bean实例。此时,Bean对象被创建但还没有设置任何属性。(这里存在推断构造方法机制,在其他文章中会进行详解.)

属性注入

根据配置文件(如XML或注解)中提供的定义,为Bean注入属性.

Aware接口回调

如果Bean实现了Spring提供的某些特殊接口(例如BeanNameAwareBeanFactoryAwareApplicationContextAware等),Spring在这个阶段回调这些接口方法,传递相应的上下文信息给Bean

BeanPostProcessor前置处理

如果容器中有配置BeanPostProcessor接口实现类,它会在Bean初始化之前对Bean进行一些处理(例如代理、修改Bean的状态等)。这个阶段是在@PostConstructInitializingBeanafterPropertiesSet方法之前.

初始化

初始化前(可选)

如果Bean实现了InitializingBean接口,或者通过配置指定了自定义的初始化方法(例如在XML中定义init-method,或通过注解@PostConstruct),Spring会在这一阶段调用这些方法。

初始化

执行初始化操作,如设置Bean的状态、启动服务等。

初始化后(可选)

在初始化完成后,Spring容器会再次调用BeanPostProcessorpostProcessAfterInitialization方法,对Bean进行后续的处理操作,如代理增强等。这一步通常会用来做AOP的相关操作

Bean就绪使用

完成以上步骤后,Bean进入就绪状态,可以被应用程序正常使用。

销毁前(可选)

Spring容器关闭时,如果Bean实现了DisposableBean接口,Spring会调用其destroy方法。或者,可以通过配置文件或注解(@PreDestroy)来指定自定义的销毁方法。这一步主要用于释放资源、关闭连接等操作。

销毁

Bean被销毁,生命周期结束。

总结

上述过程看起来非常的复杂,但是我们总结起来无非是几个大块:
在这里插入图片描述

  • 注册Bean对象的信息,生成BeanDefinition对象
  • 调用构造方法,实例化Bean对象
  • 属性注入(@Autowird,构造方法注入,setter方法注入)
  • 调用Aware回调方法
  • 调用@PostConstruct注解或者实现的InitializingBean接口方法
  • 初始化
  • 调用BeanPostProcessor中的postmanProcessAfterInitialization方法,实现AOP
;