Javajava
Spring Bean 生命周期详解
Spring Bean 生命周期涵盖实例化、属性填充、Aware 接口回调、BeanPostProcessor 前后置处理、初始化及销毁等关键阶段。单例 Bean 由容器全权管理,原型 Bean 仅负责创建与初始化。延迟加载 Bean 仅在首次使用时触发初始化。掌握各扩展点如 InitializingBean 和 DisposableBean 有助于自定义 Bean 行为及实现 AOP 功能。

Spring Bean 生命周期涵盖实例化、属性填充、Aware 接口回调、BeanPostProcessor 前后置处理、初始化及销毁等关键阶段。单例 Bean 由容器全权管理,原型 Bean 仅负责创建与初始化。延迟加载 Bean 仅在首次使用时触发初始化。掌握各扩展点如 InitializingBean 和 DisposableBean 有助于自定义 Bean 行为及实现 AOP 功能。

为了更直观地理解,我们可以将整个生命周期分为几个大的阶段:
@Component, @Service, @Autowired)或 Java 配置类(@Configuration, @Bean)来定义 Bean。ApplicationContext)启动,加载并解析这些配置元数据,生成每个 Bean 的 BeanDefinition 对象,它包含了创建一个 Bean 所需的所有信息(如类名、作用域、是否懒加载等)。@Autowired, @Value)将所需的依赖注入到 Bean 的对应属性中。这一步填充了 Bean 的'血肉'。Aware 接口,Spring 会在此阶段回调相应的方法,将一些容器相关的对象(如 BeanNameAware, BeanFactoryAware, ApplicationContextAware)注入到 Bean 中。BeanNameAware:设置 Bean 的 ID/Name。BeanFactoryAware:设置当前的 BeanFactory。ApplicationContextAware:设置当前的 ApplicationContext(功能最全)。EnvironmentAware:设置 Environment 对象(用于获取配置文件属性)等。BeanPostProcessor 接口的 Bean,它们的 postProcessBeforeInitialization 方法会在这个阶段被调用。它可以对 Bean 进行包装或增强,返回一个可能是代理对象的 Bean。BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)InitializingBean 接口:如果 Bean 实现了 InitializingBean 接口,会调用其 afterPropertiesSet() 方法。@Bean(initMethod = "...") 或 XML 中 init-method 属性指定的自定义初始化方法。InitializingBean.afterPropertiesSet()init-methodBeanPostProcessor 的 postProcessAfterInitialization 方法会被调用。Spring AOP 就是基于此实现的。如果一个 Bean 需要被代理,通常在这里返回一个代理对象来包装目标 Bean。BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)ApplicationContext)被关闭时,它会开始销毁容器中的所有单例 Bean。
DisposableBean 接口:如果 Bean 实现了 DisposableBean 接口,会调用其 destroy() 方法。@Bean(destroyMethod = "...") 或 XML 中 destroy-method 属性指定的自定义销毁方法。常用于释放资源,如关闭数据库连接、文件句柄等。DisposableBean.destroy()destroy-method@Lazy 的 Bean,只有在第一次被请求时才会触发上述初始化过程,而不是在容器启动时。可以把这个过程想象成一个人的一生:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online