Spring底层对BeanPostProcessor的使用
1,ApplicationContextAwareProcessor实现分析:
此类帮我们组建IOC容器,跟进ApplicationContextAwareProcessor我们发现, 这个后置处理器其实就是判断我们的bean有没有实现ApplicationContextAware 接口,并处理相应的逻辑,其实所有的后置处理器原理均如此.
那么怎么组建呢? 只需要实现 ApplicationContextAware 接口
步骤:
1>, 新建Plane.java(将Jeep.java复制一份即可)
class Plane implements ApplicationContextAware
分析一下ApplicationContextAwareProcessor类的方法
a,在创建Plane对象,还没初始化之前, 先判断是不是实现了ApplicationContextAware接口,
如果是的话就调用invokeAwareInterfaces方法, 并给里面注入值;
b,进入invokeAwareInterfaces()方法,判断是哪个aware, 如果是ApplicationContextAware, 就将当前的bean转成ApplicationContextAware类型, 调用setApplicationContext(), 把IOC容器注入到Plane里去;
c,用debug调用; 测试用例打断点测试
d,也可看debug调用栈来分析;
注: debug可以打在ApplicationContextAwareProcessor处理器类的applyBeanPostProcessorsBeforeInitialization()方法里, 方便调试, 当bean为Plane类型时,F5跟进看, 最终在 InvokeAwareInterfaces()方法里返回我们的IOC容器applicationContext.
2,BeanValidationPostProcess分析:数据校验,
看BeanPostProcessor接口实现CTRL+T
了解即可,处理器的原理和其它处理器一致.
当对象创建完,给bean赋值后,在WEB用得特别多;把页面提交的值进行校验
3,InitDestroyAnnotationBeanPostProcessor
此处理器用来处理@PostConstruct, @PreDestroy, 怎么知道这两注解是前后开始调用的呢, 就是 InitDestroyAnnotationBeanPostProcessor这个处理的
以@PostConstruct为例, 为什么声明这个注解后就能找到初始化init方法呢?
总结: Spring底层对BeanPostProcessor的使用, 包括bean的赋值, 注入其它组件, 生命周期注解功能,@Async, 等等