spring中aop源码解析(二)

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

Spring中aop源码解析(二)

我们上一章讲到判断对象是否需要被代理

    if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
       this.advisedBeans.put(cacheKey, Boolean.FALSE);
       return bean;
    }

上面有两个方法我们需要进入源码再进行深入分析下,一个是isInfrastructureClass 和shouldSkip

    protected boolean isInfrastructureClass(Class<?> beanClass) {
       //这里调用父类的返回 或者如果类上面有@Aspect注解 就认为是基础建设类返回true
       return (super.isInfrastructureClass(beanClass) ||
             (this.aspectJAdvisorFactory != null && this.aspectJAdvisorFactory.isAspect(beanClass)));
    }

上面的方法是AnnotationAwareAspectJAutoProxyCreator上的方法它的服务类AbstractAutoProxyCreator

    protected boolean isInfrastructureClass(Class<?> beanClass) {
      //这里判断传入的类是不是Advice/Pointcut/Advisor/AopInfrastructureBean的类或子类
       boolean retVal = Advice.class.isAssignableFrom(beanClass) ||
             Pointcut.class.isAssignableFrom(beanClass) ||
             Advisor.class.isAssignableFrom(beanClass) ||
             AopInfrastructureBean.class.isAssignableFrom(beanClass);
       return retVal;
    }

下面我们进入另一个重要的方法:

    protected boolean shouldSkip(Class<?> beanClass, String beanName) {
       // 获取所有候选的Advisor
       List<Advisor> candidateAdvisors = findCandidateAdvisors();
       for (Advisor advisor : candidateAdvisors) {
         //如果beanName为AspectJPointAdvisor直接返回true
          if (advisor instanceof AspectJPointcutAdvisor &&
                ((AspectJPointcutAdvisor) advisor).getAspectName().equals(beanName)) {
             return true;
          }
       }
       return super.shouldSkip(beanClass, beanName);
    }

下面我们进入到AbstractAspectJAutoProxyCreator方法:

    protected boolean shouldSkip(Class<?> beanClass, String beanName) {
       return false;
    }

很简单返回false不进行跳过


来源:[]()

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » spring中aop源码解析(二)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏