Spring AOP
2022-08-27 01:07:31   0  举报             
     
         
 AI智能生成
  Spring AOP 源码解析
    作者其他创作
 大纲/内容
  proxyFactory.getProxy()    
     创建 AopProxy    
     如果进行优化 或者 设置直接代理目标类  或者 没有添加代理接口
    
     被代理的类是接口  或  被代理的类是jdk生成的代理类
    
     使用jdk动态代理  JdkDynamicAopProxy  
     使用cglib 动态代理 ObjenesisCglibAopProxy
  
     否则直接使用jdk动态代理  JdkDynamicAopProxy  
     生成代理对象    
     jdk 动态代理    
     代理对象方法执行    
     如果接口中未定义  equals() hashCode() 不执行代理逻辑
  
     如果 exposeProxy 是 true,将代理对象放入  ThreadLocal<Object> currentProxy
  
     根据方法筛选出匹配的 Advice,并适配成 Interceptor    
     遍历所有的 Advisors  
     先匹配类再匹配方法  
     匹配成功将 advisor 封装成 MethodInterceptor
    
     适配器模式
MethodBeforeAdviceAdapter
AfterReturningAdviceAdapter
ThrowsAdviceAdapter
    MethodBeforeAdviceAdapter
AfterReturningAdviceAdapter
ThrowsAdviceAdapter
 如果 runTime 为 true,将  MethodInterceptor 封装为 InterceptorAndDynamicMethodMatcher
runTime 为 true时,执行方法时会进行参数匹配
  
    runTime 为 true时,执行方法时会进行参数匹配
 没有匹配的 advice,直接执行连接点被代理逻辑
  
     匹配到 advice,则执行代理逻辑    
     此时的顺序为 add 的顺序  
     cglib 动态代理    
     获取和被代理类匹配的 Advisor  (getCallbacks())  
     @EnableAspectJAutoProxy    
     注入 AspectJAutoProxyRegistrar    
     将 AnnotationAwareAspectJAutoProxyCreator 注册一个 Bean    
     初始化后    
     判断当前 Bean 是否需要 Aop  
     根据 Bean 获取匹配的 advisor    
     找到所有的 Advisor    
     找到 Advisor 类型的 Bean 对象  
     如果为空则解析切面 
    
     拿到所有 Bean,过滤出被 @Aspect 注解的Bean  
     根据 Bean 得到切面注解信息 AspectMetadata  
     将切面 Bean 封装为 MetadataAwareAspectInstanceFactory
  
     利用 AspectJAdvisorFactory 解析切面类得到 advisor    
     获取切面类中没有加 @PointCut 的方法  
     将方法封装为 advisor    
     拿到当前方法对应的 PointCut 对象  
     封装为 InstantiationModelAwarePointcutAdvisorImpl 
    
     获取 advice    
     拿到方法上的注解信息    
     @Around
    
     AspectJAroundAdvice  
     @Before
    
     AspectJMethodBeforeAdvice  
     @After
    
     AspectJAfterAdvice  
     @AfterReturning    
     AspectJAfterReturningAdvice  
     @AfterThrowing    
     AspectJAfterThrowingAdvice
  
     进行筛选
    
     先匹配类,再匹配方法(有一个方法匹配即可)  
     按 ordered 接口、@Order 对 Advisor 进行排序
  
     如果匹配到 advisor则创建代理对象  
     将 EnableAspectJAutoProxy 的属性值加入AnnotationAwareAspectJAutoProxyCreator
  
    
 
 
 
 
  0 条评论
 下一页