当前位置: 首页 > news >正文

Spring Bean 生命周期高阶用法:从回调到框架级扩展

Spring Bean 生命周期高阶用法:从回调到框架级扩展

把 Spring 容器当作一条「装配流水线」,在 7 个标准阶段之间任意「加戏」,即可零侵入地完成动态代理、多租户装配、优雅停机、第三方库接管等高级需求。


一、生命周期全景图(精简版)

阶段回调/扩展点典型用途
实例化前InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation跳过默认构造,返回代理
实例化后InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation决定是否继续属性填充
属性填充后BeanPostProcessor#postProcessProperties动态注入(如 @Value 解析增强)
初始化前BeanPostProcessor#postProcessBeforeInitialization日志、监控、AOP
初始化阶段@PostConstructInitializingBean#afterPropertiesSetinit-method业务初始化
初始化后BeanPostProcessor#postProcessAfterInitialization代理包装、缓存代理
销毁阶段@PreDestroyDisposableBean#destroydestroy-method资源释放
销毁前额外钩子DestructionAwareBeanPostProcessor#postProcessBeforeDestruction优雅停机、线程池关闭

二、6 个官方扩展点速查

接口/注解说明代码片段
InstantiationAwareBeanPostProcessor控制是否实例化/提前暴露代理见「实战 1」
SmartInstantiationAwareBeanPostProcessor解决循环依赖、选择构造器determineCandidateConstructors
BeanPostProcessor通用前置/后置处理与 Bean 实例一起注册
DestructionAwareBeanPostProcessor销毁前钩子关闭线程池、释放锁
InitializingBean / DisposableBean传统接口与容器深度集成
@PostConstruct / @PreDestroyJSR-250 注解零侵入

三、3 个高阶实战套路

1️⃣ 动态代理:在实例化阶段直接返回子类

public class RpcProxyCreator implements InstantiationAwareBeanPostProcessor {@Overridepublic Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {// 只对接口生成代理if (beanClass.isInterface() && beanClass.isAnnotationPresent(RpcClient.class)) {return Proxy.newProxyInstance(beanClass.getClassLoader(),new Class[]{beanClass},new RpcInvocationHandler());}return null; // 返回 null,继续默认流程}
}

效果:接口无需实现类,容器直接注入代理对象。

2️⃣ 多租户 Bean:实例化后动态注入租户字段

public class TenantBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {if (bean instanceof TenantAware) {((TenantAware) bean).setTenantId(TenantContext.get());}return bean;}
}

效果:同一个 TenantService 在不同租户下拥有独立字段值。

3️⃣ 优雅停机:线程池安全关闭

public class ExecutorShutdownProcessor implements DestructionAwareBeanPostProcessor {@Overridepublic void postProcessBeforeDestruction(Object bean, String beanName) {if (bean instanceof ExecutorService) {ExecutorService es = (ExecutorService) bean;es.shutdown();try { es.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException ie) { es.shutdownNow(); }}}
}

效果:容器关闭时,所有线程池优雅终止,避免任务丢失。


四、组合模板:一条 Bean 同时享受所有钩子

@Component
public class MyBean implements InitializingBean, DisposableBean {@PostConstructpublic void postConstruct() { /* 注解初始化 */ }@Overridepublic void afterPropertiesSet() { /* 接口初始化 */ }@PreDestroypublic void preDestroy() { /* 注解销毁 */ }@Overridepublic void destroy() { /* 接口销毁 */ }
}

执行顺序(Spring 5.3+)

① postProcessBeforeInitialization
② @PostConstruct
③ afterPropertiesSet
④ postProcessAfterInitialization
⑤ 业务运行
⑥ @PreDestroy
⑦ destroy
⑧ postProcessBeforeDestruction

五、常见误区 & 对策

误区正解
在 Bean 内部直接 new Thread()ExecutorService 并注册销毁钩子
实现 InitializingBean 导致无法单元测试改用 @PostConstruct,更易 Mock
循环依赖无法解决实现 SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

六、一句话总结

掌握 InstantiationAware、BeanPostProcessor、DestructionAware 三大接口,
就可以把 Spring Bean 生命周期变成「乐高流水线」:
实例化前换零件、初始化后加装饰、销毁前做清理——
高级玩法,不过如此。

http://www.dtcms.com/a/351981.html

相关文章:

  • Android系统学习2——Android.Utils.Log模块讨论
  • Android 系统属性添加篇
  • StandardScaler()进行0,1标准化时fit_transform与transform的区别
  • MIME类型与文件上传漏洞 - 网络安全视角
  • 【Jetson】基于llama.cpp部署gpt-oss-20b(推理与GUI交互)
  • 多地闭店上热搜,中产的白月光无印良品怎么了?
  • 项目管理进阶——项目经理任职资格评定聘任及考核管理办法
  • 支持向量机(SVM)核心概念总结
  • Tensor常见操作
  • vscode使用cmake tool进行项目管理安装
  • Elasticsearch映射:优化搜索性能的关键
  • 【无标题】计数组合学7.21(有界部分大小的平面分拆)
  • JVM模型
  • 微信小程序web-view嵌套H5,小程序与H5通信
  • 不安全的服务器,不支持 FTP over TLS
  • 服务器从0到1微服务所需的环境的安装
  • 数据结构(一):算法的时间复杂度和空间复杂度
  • 双坡阳光房光伏设计,精准实现降本增效
  • 【Python】QT(PySide2、PyQt5):列表数据保存到文件,文件数据加载到列表
  • QT(QTableWidget)
  • Matlab使用——开发上位机APP,通过串口显示来自单片机的电压电流曲线,实现光伏I-V特性监测的设计
  • 盲盒一番赏小程序:打造个性化潮玩购物天堂
  • vs2022 Nuget包缓存下载路径配置
  • 国产机安装caj 国产机没法打开caj文件,国产机如何看论文?
  • AIGC(生成式AI)试用 35 -- AI Agent开发及工作流,LangFlow
  • github拉取OpenSSL SSL_read: Connection was reset, errno 10054
  • Element中table组件(el-table)右侧滚动条空白占位gutter处理
  • window电脑使用OpenSSL创建Ed25519密钥
  • 由倍讯科技研制的CCLinkIE转ModbusTCP网关,可达成与脉冲计数器的连接
  • Tesseract OCR之单词识别与字符分类器