AOP 原理解析 从spring 源码角度

304 阅读2分钟

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