spring AOP @EnableAspectJAutoProxy原理

1)@EnableAspectJAutoProxy 开启AOP功能

@EnableAspectJAutoProxy@Import(AspectJAutoProxyRegistrar.class)
AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar,实现registerBeanDefinitions方法
自定义给容器中注册bean:【internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator

2)容器的创建流程

refresh()函数有个registerBeanPostProcessors方法, 它创建和注册AnnotationAwareAspectJAutoProxyCreator,这是个后置处理器,以方便后续拦截bean的创建 refresh()函数中finishBeanFactoryInitialization创建剩下的单实例。单实例缓存没有就创建, resolveBeforeInstantiation,希望后置处理器在此能返回一个代理对象; 如果能返回代理对象就使用,如果不能就doCreateBean resolveBeforeInstantiation拿到所有后置处理器,如果实现InstantiationAwareBeanPostProcessor 就执行postProcessBeforeInstantiationpostProcessAfterInstantiation拦截方法, 而AnnotationAwareAspectJAutoProxyCreator就实现此接口,拦截方法中创建bean的代理对象给容器

3)执行目标方法

代理对象中的peoxyFactory包含增强器,目标对象,
目标方法执行,CglibAopProxy.intercept();遍历所有的增强器,将其转为Interceptor,利用MethodInterceptor机制生成拦截器链,
如果有拦截器链,把需要执行的目标对象,目标方法,拦截器链等信息传入创建一个 CglibMethodInvocation 对象,
调用mi.proceed(),链式获取每一个拦截器,拦截器执行invoke方法,每一个拦截器等待下一个拦截器执行完成返回以后再来执行;
拦截器链的机制,保证通知方法与目标方法的执行顺序
    原文作者:AOP
    原文地址: https://blog.csdn.net/sjtu_chenchen/article/details/80641518
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞