spring中aop源码解析(二)

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值