BeanPostProcessor 为什么这么重要?Spring 几乎所有黑科技都靠它

BeanPostProcessor 为什么这么重要?Spring 几乎所有黑科技都靠它 很多人学 Spring 生命周期时都会看到实例化↓属性填充↓Aware 回调↓BeanPostProcessor 前置↓初始化↓BeanPostProcessor 后置↓放入单例池然后背下来postProcessBeforeInitialization()postProcessAfterInitialization()但是问题来了BeanPostProcessor 到底干了什么为什么 Spring AOP、Autowired、事务、异步这些功能全都离不开它答案BeanPostProcessor 是 Spring 留给框架的“插件入口”Spring 自己的大量能力本质上都是创建 Bean → 扔给 BeanPostProcessor 加工 → 返回增强后的 Bean如果没有它Spring 就只是个对象工厂先看源码位置创建 Bean 核心流程AbstractAutowireCapableBeanFactorydoCreateBean()关键代码ObjectexposedObjectbean;populateBean(beanName,mbd,instanceWrapper);exposedObjectinitializeBean(beanName,exposedObject,mbd);继续protectedObjectinitializeBean(...)里面wrappedBeanapplyBeanPostProcessorsBeforeInitialization(wrappedBean,beanName);invokeInitMethods();wrappedBeanapplyBeanPostProcessorsAfterInitialization(wrappedBean,beanName);流程Bean创建完成↓BeanPostProcessor前置↓初始化↓BeanPostProcessor后置↓返回最终Bean看起来没什么真正可怕的是Spring 会循环调用所有 BPP源码for(BeanPostProcessorprocessor:getBeanPostProcessors()){resultprocessor.postProcessAfterInitialization(result,beanName);}意思是Bean↓BPP1处理↓BPP2处理↓BPP3处理↓BPP4处理↓最终Bean这意味着任何框架都能插队图看整个过程真正重要的是BeanPostProcessor 可以替换原对象注意不是修改。而是直接返回新对象例如OverridepublicObjectpostProcessAfterInitialization(Objectbean,StringbeanName){returnproxyBean;}原来UserService出来已经不是同一个对象了。这就是 AOP 的核心。Spring AOP 怎么偷偷换对象举个例子ServicepublicclassOrderService{Transactionalpublicvoidsave(){}}你以为注入的是OrderService实际上OrderService代理对象生成代理的位置AbstractAutoProxyCreator继承关系AbstractAutoProxyCreator↓InstantiationAwareBeanPostProcessor↓BeanPostProcessor核心postProcessAfterInitialization()源码if(需要代理){returncreateProxy(bean);}returnbean;流程创建OrderService↓BeanPostProcessor发现Transactional↓创建代理↓替换原对象↓放入容器所以容器里压根没有你写的对象。而是代理对象。原因就在这。Autowired 也是 BeanPostProcessor 干的很多人以为Autowired 是 Spring 自动支持的。其实不是真正工作的AutowiredAnnotationBeanPostProcessor它也是BeanPostProcessor源码postProcessProperties(...)里面InjectionMetadata.inject(...)扫描AutowiredResourceValue然后反射注入。流程实例化Bean↓BeanPostProcessor扫描字段↓找到Autowired↓反射注入对象所以没有它Autowired 根本不会生效。Spring 为什么设计成这样因为 Spring 自己也不知道以后会扩展出什么能力。所以留一个BeanPostProcessor谁想扩展自己实现即可例如ComponentpublicclassLogBeanPostProcessorimplementsBeanPostProcessor{OverridepublicObjectpostProcessAfterInitialization(Objectbean,StringbeanName){System.out.println(beanName);returnbean;}}启动userServiceorderServicecontrollermapper所有 Bean 都会经过这里相当于全局拦截器一句话总结Bean 生命周期决定 Bean 怎么出生而 BeanPostProcessor 决定Bean 出生后要不要被改造Spring 大部分能力AOPAutowiredResourceAsyncTransactionalValue本质都是Bean创建↓BeanPostProcessor加工↓返回增强对象没有 BeanPostProcessorSpring 就只是new Object()有了 BeanPostProcessorSpring 才变成框架.关于老潘持续拆 Spring、MySQL、Redis 底层原理复盘真实线上问题。一起把“会用”变成“看懂”。如果有帮助点个赞、收藏支持一下。下一篇Spring 为什么如此依赖反射因为它根本不知道你会写什么感兴趣可以关注避免刷着刷着找不到。