HiSEN

初识 Spring AOP 与 BeanPostProcess

零、背景

最近在做重构的项目
进入阶段性收尾阶段
总结记录下相关的内容
方便大家遇到类似问题可以想起有某个地方可以参考

一、初识 AOP

目前的 AOP 应用,由于公司生态体系不够完善
利用 AOP + ThreadLocal(transmittable-thread-local,ttl)
做一部分链路追踪的事情( 耗时打印,traceId 处理 )
这部分倒是很简单,只是之前用的很少

PS:链路追踪蛮重要,针对排查问题,性能监控等大有帮助,多关注开源协议/实现( 如 CNCF )

二、初识 BeanPostProcess

2.1 应用场景

目前做的项目当中,有一个 IDC 负载均衡的工具
有设置当前机器所属机房的方法,但是没有提供从配置文件读取的能力
因为 IDC 路由不生效,会造成跨机房访问,导致访问延迟偏高( 回头再写性能优化相关内容 )

当时发现这个问题的时候已经上线,以稳定性为主,不想升级 jar 版本
于是乎当时想通过 AOP 或者字节码的方式去做一个增强

当然,由于知识浅薄,AOP 写对了,但是不生效,工具初始化的先于 AOP 的作用时间。

接下来就通过搜索引起各种找,偶然发现 BeanPostProcess (之前也通过一些 spring 回调做应用预热)

于是就开始一番操作,果然给解决问题了。

2.2 代码概览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Idc implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof ClientFactory) {
ClientFactory clientFactory = (ClientFactory) bean;
String idc = System.getenv("IDC");
if (StringUtils.isNotBlank(idc)) {
clientFactory.setIdc(idc);
}
clientFactory.setIdc("nj");
}
return bean;
}
}

2.2 BeanPostProcess 文档

BeanPostProcess API

三、总结

之前一直在做业务开发
也很少做从零到一的项目
即使看过一些 spring 的书籍和文档
但是还是没有理解太深,没有太注意
果然是书到用时方恨少哇,以后还是万事深挖一步

spring 生命周期,启动流程,各种回调,有必要看看,跑 demo 试试。

四、参考文档