zoukankan      html  css  js  c++  java
  • AOP动态代理解析2-代码织入入口

    通过自定义配置完成了对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)根据获取的增强进行代理

     

  • 相关阅读:
    解决Python开发中,Pycharm中无法使用中文输入法问题
    PointNet++作者的视频讲解文字版
    StringBuilder
    DropDownList 添加“请选择”
    SQLServer 2008中SQL增强之三 Merge(在一条语句中使用
    ASP.NET Web Forms 的 DI 應用範例
    怎么设置环境变量
    ParameterizedThreadStart,ThreadStart的使用,线程Thread传参数
    异步删除
    SqlCommandBuilder的作用
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/6076817.html
Copyright © 2011-2022 走看看