spring-aop

一、aop代理类何时创建

 1、无循环依赖

bean初始化时,后置处理器AnnotationAwareAspectJAutoProxyCreator查询当前的bean对象是否有Advisor(执行通知者),若有则生成代理对象

bean的初始化

initializeBean(beanName, bean, beanDefinition){
    // 初始化aware方法
    invokeAwareMethods(beanName, bean);
    // 初始化方法之前的  前置处理器
    wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName)

    // afterPropertiesSet 或者自定义的init方法
    this.invokeInitMethods(beanName, wrappedBean, mbd);

    // 初始化方法之后的  后置处理器  
    wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}


aop后置处理器 -- 
AnnotationAwareAspectJAutoProxyCreator implements BeanPostProcessor {

   public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
       
        //spring aop代理主代码
        AbstractAutoProxyCreator.wrapIfNecessary(bean, beanName, cacheKey){

           Object[] specificInterceptors = AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(){

                 //查询出所有的切面
                findCandidateAdvisors();
                //进行过滤条件方法匹配
                findAdvisorsThatCanApply(list, beanClass, beanName)
                //排序
                sortAdvisors()

            }
            
            if (specificInterceptors != null) {
                //生成代理类
                return createProxy()

            }else{
                return bean;
            }
          
        }
       
  }

}



 2、有循环依赖

bean进行属性注入时,发现有循环依赖,则调用三级缓存factory的执行getObject进行生成代理,生成完成之后移入二级缓存,

        提前曝光的bean在提前引用时被Spring AOP代理了,但是此时的bean只是经过了实例化的bean,还没有进行属性的注入,也就是说此时代理的bean里面的属性是空的

spring循环依赖

@Service
@Order(1)
public class A {

    private B b;
    
    @Autowired
    public void setB(B b) {
        this.b = b;
    }

    public String a(){
      return "a";
  }
  
}

@Service
public class B implements Ordered {
    
    private A a;
    
    @Autowired
    public void setA(A a) {
        this.a = a;
    }

    @Override
    public int getOrder() {
        return 2;
    }
    
}

//获取A对象
doGetBean(name)

//从三级缓存中获取A对象
Object sharedInstance = this.getSingleton(beanName);

//获取不到开始创建对象A  beanName = "a"
doCreateBean(beanName, RootBeanDefinition, args)

//所有的bean对象都会添加一个factory,为后面生成代理对象使用,以及解决循环依赖问题
this.addSingletonFactory(beanName, () -> {
                return this.getEarlyBeanReference(beanName, mbd, bean);
            });

//属性设置赋值 
AbstractAutowireCapableBeanFactory.populateBean(beanName, beanDefinition, BeanWrapper)


//A对象的注入属性b
AutowiredAnnotationBeanPostProcessor.postProcessProperties(PropertyValues, bean, beanName)

AutowiredAnnotationBeanPostProcessor.AutowiredMethodElement.inject(bean, beanName, PropertyValues)


//resolve调用方法的参数值
//method="public void com.example.myspr.A.setB(com.example.myspr.B)"  beanName="a"
arguments = this.resolveMethodArguments(method, bean, beanName);


AutowiredAnnotationBeanPostProcessor.this.beanFactory.resolveDependency(currDesc, beanName, autowiredBeans, typeConverter)



Object result = ContextAnnotationAutowireCandidateResolver.getLazyResolutionProxyIfNecessary(descriptor, requestingBeanName);
//懒加载 直接构建个代理对象,注入的是一个代理非完全初始化的对象,当它首次被使用时才完全初始化
if (result == null) {
    //非懒加载
    result = this.doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);
}
return result;


//非lazy  autowiredBeanName="b"  type= class com.example.myspr.B
DependencyDescriptor.resolveCandidate(autowiredBeanName, Class<?> type, beanFactory)


beanFactory.getBean(beanName)

//从三层缓存中获取b对象,重复上述流程,获取不到进行b对象的实例化、属性注入、初始化流程
doGetBean(name)


//再对b对象的属性注入a阶段时,获取对象A,能够从三级缓存获取,调用factory.getObject方法
Object sharedInstance = this.getSingleton(beanName);


getEarlyBeanReference(bean, beanName)


//以下同上
wrapIfNecessary(bean, beanName, cacheKey){

           Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(){

                 //查询出所有的切面
                findCandidateAdvisors();
                //进行过滤条件方法匹配
                findAdvisorsThatCanApply(list, beanClass, beanName)
                //排序
                sortAdvisors()

            }
            
            if (specificInterceptors != null) {
                //生成代理类
                return createProxy()

            }else{
                return bean;
            }
          
        }


二、切面执行顺序

1、不同切面类顺序

  1. 判断当前所在的切面类是否实现org.springframework.core.Ordered接口
  2. 判断当前Advisor所在的切面类是否包含org.springframework.core.annotation.Order注解
  3. 判断当前Advisor所在的切面类是否包含javax.annotation.Priority注解
  4. 没有取到值,默认为最低优先级,值为最大Int
  5. 顺序一致时,则按spring获取到切面bean的顺序做排序,先获取先执行
AspectJAwareAdvisorAutoProxyCreator{

 protected List<Advisor> sortAdvisors(List<Advisor> advisors) {
        List<AspectJAwareAdvisorAutoProxyCreator.PartiallyComparableAdvisorHolder> partiallyComparableAdvisors = new ArrayList(advisors.size());
        Iterator var3 = advisors.iterator();

        while(var3.hasNext()) {
            Advisor advisor = (Advisor)var3.next();
            partiallyComparableAdvisors.add(new AspectJAwareAdvisorAutoProxyCreator.PartiallyComparableAdvisorHolder(advisor, DEFAULT_PRECEDENCE_COMPARATOR));
        }

        List<AspectJAwareAdvisorAutoProxyCreator.PartiallyComparableAdvisorHolder> sorted = PartialOrder.sort(partiallyComparableAdvisors);
        if (sorted == null) {
            return super.sortAdvisors(advisors);
        } else {
            List<Advisor> result = new ArrayList(advisors.size());
            Iterator var5 = sorted.iterator();

            while(var5.hasNext()) {
                AspectJAwareAdvisorAutoProxyCreator.PartiallyComparableAdvisorHolder pcAdvisor = (AspectJAwareAdvisorAutoProxyCreator.PartiallyComparableAdvisorHolder)var5.next();
                result.add(pcAdvisor.getAdvisor());
            }

            return result;
        }
    }

}



AnnotationAwareOrderComparator{

 @Nullable
    protected Integer findOrder(Object obj) {
        Integer order = super.findOrder(obj);
        return order != null ? order : this.findOrderFromAnnotation(obj);
    }

    @Nullable
    private Integer findOrderFromAnnotation(Object obj) {
        AnnotatedElement element = obj instanceof AnnotatedElement ? (AnnotatedElement)obj : obj.getClass();
        MergedAnnotations annotations = MergedAnnotations.from((AnnotatedElement)element, SearchStrategy.TYPE_HIERARCHY);
        Integer order = OrderUtils.getOrderFromAnnotations((AnnotatedElement)element, annotations);
        return order == null && obj instanceof DecoratingProxy ? this.findOrderFromAnnotation(((DecoratingProxy)obj).getDecoratedClass()) : order;
    }

    @Nullable
    public Integer getPriority(Object obj) {
        if (obj instanceof Class) {
            return OrderUtils.getPriority((Class)obj);
        } else {
            Integer priority = OrderUtils.getPriority(obj.getClass());
            return priority == null && obj instanceof DecoratingProxy ? this.getPriority(((DecoratingProxy)obj).getDecoratedClass()) : priority;
        }
    }

}

 2、同切面类下的advice通知执行顺序

@around{

        around start

        @before

         proceeding.proceed(proceeding.getArgs())

        @AfterReturning

        @After (可看成finally)

        around end

}

3、 同一个切面类里面定义的多个通知,会按照方法名自然排序

@Before(value = "execution(* com.example..A.a(..))()")
    public void _a1(){
        System.out.println("before a1");
    }

    @Before(value = "execution(* com.example.myspr..*(..))")
    public void _b0(){
        System.out.println("before b0");
    }

    @Before(value = "execution(* com.example..A.*(..))")
    public void _a2(){
        System.out.println("before a2");
    }


    @After(value = "execution(* com.example..A.a(..))()")
    public void a1(){
        System.out.println("After a1");
    }

    @After(value = "execution(* com.example.myspr..*(..))")
    public void b0(){
        System.out.println("After b0");
    }

    @After(value = "execution(* com.example..A.*(..))")
    public void a2(){
        System.out.println("After a2");
    }


//
before a1
before a2
before b0
After b0
After a2
After a1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值