美文网首页
转-AOP动态代理解析2-代码织入入口

转-AOP动态代理解析2-代码织入入口

作者: 小陈阿飞 | 来源:发表于2018-11-28 11:40 被阅读0次

https://www.cnblogs.com/wade-luffy/p/6076817.html

通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类到底做了什么工作来完成AOP的操作呢?首先我们看看AnnotationAwareAspectJAutoProxyCreator类的层次结构

在类的层级中,我们看到AnnotationAwareAspectJAutoProxyCreator实现了BeanPostProcessor接口,而实现BeanPostProcessor后,当Spring加载这个Bean时会在实例化前调用其postProcessAfterInitialization方法,而对于AOP逻辑的分析也由此开始。

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException  
{ if(bean != null)  
    { //根据给定的bean的class和name构建出个key,格式:beanClassName_beanName 
       Object cacheKey = getCacheKey(bean.getClass(), beanName); if(!earlyProxyReferences.containsKey(cacheKey)) //如果它适合被代理,则需要封装指定bean 
          return wrapIfNecessary(bean, beanName, cacheKey);  
    } return bean;  
} protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey)  
   { //如果已经处理过 
      if(beanName != null && targetSourcedBeans.containsKey(beanName)) return bean; //无需增强 
      if(Boolean.FALSE.equals(advisedBeans.get(cacheKey))) return bean; //给定的bean类是否代表一个基础设施类,基础设施类不应代理,或者配置了指定bean不需要自动代理 
      if(isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName))  
       {  
           advisedBeans.put(cacheKey, Boolean.FALSE); return bean;  
       } //如果存在增强方法则创建代理 
      Object specificInterceptors[] = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null); //如果获取到了增强则需要针对增强创建代理 
       if(specificInterceptors != DO_NOT_PROXY)  
       {  
           advisedBeans.put(cacheKey, Boolean.TRUE); //创建代理 
           Object proxy = createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));  
           proxyTypes.put(cacheKey, proxy.getClass()); return proxy;  
       } else {  
           advisedBeans.put(cacheKey, Boolean.FALSE); return bean;  
       }  
   } 

函数中我们已经看到了代理创建的雏形。当然,真正开始之前还需要经过一些判断,比如是否已经处理过或者是否是需要跳过的bean,而真正创建代理的代码是从getAdvicesAndAdvisorsForBean开始的。

创建代理主要包含了两个步骤:
(1)获取增强方法或者增强器;
(2)根据获取的增强进行代理。

相关文章

  • 转-AOP动态代理解析2-代码织入入口

    https://www.cnblogs.com/wade-luffy/p/6076817.html 通过自定义配置...

  • Java动态代理

    Java动态代理 引言 最近在看AOP代码,其中利用到了Java动态代理机制来实现AOP织入。所以好好地把Java...

  • Java 反射实现 Aop 代理

    利用反射生成JDK的动态代理,也就是AOP中的AOP代理,代替目标对象,从而在代码中织入增强。 定义代理接口 由于...

  • Spring AOP的总体流程

    注册解析 AOP的服务 解析和加载横切逻辑 将横切逻辑织入目标Bean中 Spring 动态代理不会干预 Bean...

  • spring AOP 编程式应用

    一、spring AOP 和 AspectJ spirng AOP: 是基于对象代理模式进行织入逻辑代码,但对于s...

  • Java JDK Proxy和CGLib动态代理示例讲解

    简介 代理模式在Java中有很多应用场景,而代理又分静态代码和动态代理。静态代理是编写、编译或加载时织入代码实现,...

  • 三种代理模式和观察者

    1.带有接口的静态代理 2.JDK的动态代理:AOP中对方法的增强叫织入(weaving),对类的增强叫引入(In...

  • Spring AOP从零单排-织入时期源码分析

    问题:Spring AOP代理中的运行时期,是在初始化时期织入还是获取对象时期织入? 织入就是代理的过程,指目标对...

  • Spring学习系列--3.AOP

    Spring Aop Aop面向切面编程 Aop入门动态代理 动态代理,其实与Aop的原理有些相似,可以用动态代理...

  • 动态AOP

    动态AOP 上篇文章我们讲到,AOP分为静态AOP和动态AOP。静态AOP在代码编译之后,已经有代理类或者已经改变...

网友评论

      本文标题:转-AOP动态代理解析2-代码织入入口

      本文链接:https://www.haomeiwen.com/subject/tdjaqqtx.html