spring 中的AOP 源代码层面原理解析
AOP 叫做面向切面编程,
大家都知道 AOP 实现用的动态代理,要么是JDK动态代理,要么是CGLIB动态代理,
本文从源码角度来看看AOP 是怎么实现动态代理替换bean的
AOP的切面对象是在 扫描 @COnfiguration 的时候就建立了的
如下图,被代理的对象就是 Calculate,
第一步生成AOP 动态代理对象
下面的图是AOP生成动态代理对象的过程,生成动态代理对象后放到spring 容器中,用这个动态代理对象替换掉了原本的bean对象。图片上面字有点小 可以放大了看
第二步 生成代理对象之后是如何把各种before after around 之类的通知对象织入到原有逻辑之中的呢???
AOP 使用了责任链+递归调用的方式 如下图所示下面6个中1-5是加到了方法上面的通知器,第0个我也不知道是干什么的???希望知道的大佬在评论去说一下
大概的示意图如图示,下面的是JDK动态代理的实现,除了使用的invoke 方法外其他的和CGLIB相差不多
![]
其中调用链是下面这样的,递归调用,
expose->after throwing -->after returning -->after-->around-(执行了around方法)-->before(执行了before 方法)-->切点方法(执行了切点方法)-》before---》
责任链+递归调用
![]
bean工厂后置处理器
bean 后置处理器
在AbstractAutowiredCapableBeanFactory。java中下面的方法中有两个扩展点,
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
分别是下面两个
在bean初始化之前执行的:
Object current = processor.postProcessBeforeInitialization(result, beanName);
在bean初始化之后执行的
Object current = processor.postProcessAfterInitialization(result, beanName);
InstantiationAwareBeanPostProcessors