Back to Javatutorial

Spring探秘之AOP的执行顺序

docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/Spring探秘之AOP的执行顺序.md

1.0.017.8 KB
Original Source

spring aop ִʱ˳ģθıִеȼĽԴ̽ aop ִ˳ܡ

spring aop ֮ AnnotationAwareAspectJAutoProxyCreator ϣ spring aop ֮ AnnotationAwareAspectJAutoProxyCreator £Уݹ spring aop ִй̣һι aop

  • ReflectiveAspectJAdvisorFactory#getAdvisorMethods aspect е @Around/@Before/@After ȷ
  • AspectJAwareAdvisorAutoProxyCreator#sortAdvisors advisor

ص

1 ReflectiveAspectJAdvisorFactory#getAdvisorMethods

һ ReflectiveAspectJAdvisorFactory#getAdvisorMethodsýṹ£

|-AbstractAutoProxyCreator#postProcessBeforeInstantiation
  |-AspectJAwareAdvisorAutoProxyCreator#shouldSkip
   |-AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors
    |-BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors
     |-ReflectiveAspectJAdvisorFactory#getAdvisors
      |-ReflectiveAspectJAdvisorFactory#getAdvisorMethods

£

ReflectiveAspectJAdvisorFactory

// ȡ @Aspect еķ
private List<Method> getAdvisorMethods(Class<?> aspectClass) {
    final List<Method> methods = new ArrayList<>();
    // ʡԻȡIJ
    ...

    //Եõз
    methods.sort(METHOD_COMPARATOR);
    return methods;
}

IJ spring aop ֮ AnnotationAwareAspectJAutoProxyCreator ϣ һϸǽע

ReflectiveAspectJAdvisorFactory

/**
 * METHOD_COMPARATOR 
 */
private static final Comparator<Method> METHOD_COMPARATOR;
static {
    Comparator<Method> adviceKindComparator = new ConvertingComparator<>(
            // Ƚ˳бȽ
            new InstanceComparator<>(
                    Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class),
            // תתΪ @Around, @Before, @After, @AfterReturning, @AfterThrowing ע
            (Converter<Method, Annotation>) method -> {
                AspectJAnnotation<?> annotation =
                    AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(method);
                return (annotation != null ? annotation.getAnnotation() : null);
            });
    // תȽ
    // 1\. תķ(Method)תΪ(String)
    // 2\. ȽϣͽбȽϣﴫĵΪStringԭתMethodתString
    Comparator<Method> methodNameComparator = new ConvertingComparator<>(Method::getName);
    /*
     * METHOD_COMPARATOR ȽϹ
     * 1\. ʶע,  @Around, @Before, @After, @AfterReturning,
     *       @AfterThrowing ˳ (`adviceKindComparator`)
     * 2\. ûбʶЩע⣬򰴷Ƶַ(`methodNameComparator`)
     */
    METHOD_COMPARATOR = adviceKindComparator.thenComparing(methodNameComparator);
}

ܽ£

  1. Ķͬһ @Aspect еķ
  2. 淽£@Around, @Before, @After, @AfterReturning, @AfterThrowing
  3. ڷ淽String

÷ǰı仯£

ǰ

Ƿ @Around, @Before, @After, @AfterReturning,@AfterThrowing ˳һ¡

õ List<Method> 󣬽ŻЩ methodװΪһ advisor

ReflectiveAspectJAdvisorFactory

public List<Advisor> getAdvisors(MetadataAwareAspectInstanceFactory aspectInstanceFactory) {
    // ʡһЩ
    ...

    List<Advisor> advisors = new ArrayList<>();
    //ȡеǿ
    for (Method method : getAdvisorMethods(aspectClass)) {
        // ǿʵadvisors.size() Ϊ 012... 
        // declarationOrderInAspect ֵõ
        Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, 
                advisors.size(), aspectName);
        if (advisor != null) {
            advisors.add(advisor);
        }
    }

    // ʡһЩ
    ...
}

װ Advisor ʱᴫ declarationOrderInAspect ֵֵΪ advisors.size()Ϊ 012...ֵںлõ

2. advisor AspectJAwareAdvisorAutoProxyCreator#sortAdvisors

@Aspect е淽װ advisor 󣬻߻ȡԶ advisor 󣬽žͽ˵ڶAspectJAwareAdvisorAutoProxyCreator#sortAdvisorsĵ£

|-AbstractAutoProxyCreator#postProcessAfterInitialization
 |-AbstractAutoProxyCreator#wrapIfNecessary
  |-AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean
   |-AbstractAdvisorAutoProxyCreator#findEligibleAdvisors
    |-AspectJAwareAdvisorAutoProxyCreator#sortAdvisors

AspectJAwareAdvisorAutoProxyCreator

protected List<Advisor> sortAdvisors(List<Advisor> advisors) {
    List<PartiallyComparableAdvisorHolder> partiallyComparableAdvisors 
            = new ArrayList<>(advisors.size());
    for (Advisor element : advisors) {
        partiallyComparableAdvisors.add(
            // ȽϹΪ DEFAULT_PRECEDENCE_COMPARATOR,ʵAspectJPrecedenceComparator
            new PartiallyComparableAdvisorHolder(element, DEFAULT_PRECEDENCE_COMPARATOR));
    }
    // ıȽϲȽϹ AspectJPrecedenceComparator ṩ
    List<PartiallyComparableAdvisorHolder> sorted 
            = PartialOrder.sort(partiallyComparableAdvisors);
    if (sorted != null) {
        List<Advisor> result = new ArrayList<>(advisors.size());
        for (PartiallyComparableAdvisorHolder pcAdvisor : sorted) {
            result.add(pcAdvisor.getAdvisor());
        }
        return result;
    }
    else {
        return super.sortAdvisors(advisors);
    }
}

һ PartialOrder.sort(...)һ super.sortAdvisors(...) PartialOrder.sort(...)

2.1 PartialOrder.sort(...) ıȽAspectJPrecedenceComparator

ʵϣPartialOrder.sort(...) ֻҪһѣûɶģҪӦǴҲ DEFAULT_PRECEDENCE_COMPARATOR

private static final Comparator<Advisor> DEFAULT_PRECEDENCE_COMPARATOR 
        = new AspectJPrecedenceComparator();

DEFAULT_PRECEDENCE_COMPARATOR AspectJPrecedenceComparatorֱӲ鿴 compare(xxx)

AspectJPrecedenceComparator

@Override
public int compare(Advisor o1, Advisor o2) {
    // ȽϹAnnotationAwareOrderComparator
    int advisorPrecedence = this.advisorComparator.compare(o1, o2);
    // ˳ͬԴͬһ aspect comparePrecedenceWithinAspect ٴαȽ
    if (advisorPrecedence == SAME_PRECEDENCE && declaredInSameAspect(o1, o2)) {
        // Ƚ˳һafter֪ͨȼߣȼ
        advisorPrecedence = comparePrecedenceWithinAspect(o1, o2);
    }
    return advisorPrecedence;
}

AspectJPrecedenceComparator#compare Ƚϼ򵥣£

  1. advisorComparator.compare бȽϣȽϹǽ
  2. ȽϹõȼͬ advisor ͬһ aspect жģ comparePrecedenceWithinAspect Ƚ.
this.advisorComparator.compare

this.advisorComparator.compare ıȽϹ

private final Comparator<? super Advisor> advisorComparator;

public AspectJPrecedenceComparator() {
    this.advisorComparator = AnnotationAwareOrderComparator.INSTANCE;
}

public int compare(Advisor o1, Advisor o2) {
    // ȽϹAnnotationAwareOrderComparator
    int advisorPrecedence = this.advisorComparator.compare(o1, o2);
    ...
}

this.advisorComparator.compare ıȽϹ AnnotationAwareOrderComparator

public int compare(@Nullable Object o1, @Nullable Object o2) {
    return doCompare(o1, o2, null);
}

/**
 * ıȽϲȱȽ PriorityOrderedٱȽ Ordered
 */
private int doCompare(@Nullable Object o1, @Nullable Object o2, 
        @Nullable OrderSourceProvider sourceProvider) {
    // ֮һΪ PriorityOrdered˭PriorityOrdered˭ȼ
    boolean p1 = (o1 instanceof PriorityOrdered);
    boolean p2 = (o2 instanceof PriorityOrdered);
    if (p1 && !p2) {
        return -1;
    }
    else if (p2 && !p1) {
        return 1;
    }
    // orderֵȲOrderedӿڣûҵٲ @Order ע
    int i1 = getOrder(o1, sourceProvider);
    int i2 = getOrder(o2, sourceProvider);
    // IntegerбȽ
    return Integer.compare(i1, i2);
}

Ĵ֪ȱȽ PriorityOrderedٱȽ OrderedȽϹ£

  1. PriorityOrdered Ƚϣ֮Уֻһʵ PriorityOrdered ӿڣôΪ PriorityOrdered ȼߣ Ordered ĹȽϣ
  2. Ordered ȽϹ
    1. ʵ Ordered PriorityOrdered ӿڣ getOrder() ֵбȽϣֵԽСȼԽߣ
    2. ע @Order/@Priority ע⣬ value() ֵбȽϣֵԽСȼԽߣ
    3. ûʵ Ordered/PriorityOrderedҲûбע @Order/@Priority ע⣬Ϊȼ (Integer.MAX_VALUE).
comparePrecedenceWithinAspect

@Aspect ע࣬ͬһ aspect ﶨͬ advicespring aop ҲṩһױȽϹ

/**
 *  @Aspect ͬһaspectﶨͬ adviceٴαȽ
 */
private int comparePrecedenceWithinAspect(Advisor advisor1, Advisor advisor2) {
    boolean oneOrOtherIsAfterAdvice = (AspectJAopUtils.isAfterAdvice(advisor1) 
            || AspectJAopUtils.isAfterAdvice(advisor2));
    int adviceDeclarationOrderDelta = getAspectDeclarationOrder(advisor1) 
            - getAspectDeclarationOrder(advisor2);
    // һafter֪ͨdeclarationOrderInAspectȼ
    if (oneOrOtherIsAfterAdvice) {
        if (adviceDeclarationOrderDelta < 0) {
            return LOWER_PRECEDENCE;
        }
        else if (adviceDeclarationOrderDelta == 0) {
            return SAME_PRECEDENCE;
        }
        else {
            return HIGHER_PRECEDENCE;
        }
    }
    // ߶after֪ͨdeclarationOrderInAspectСȼ
    else {
        if (adviceDeclarationOrderDelta < 0) {
            return HIGHER_PRECEDENCE;
        }
        else if (adviceDeclarationOrderDelta == 0) {
            return SAME_PRECEDENCE;
        }
        else {
            return LOWER_PRECEDENCE;
        }
    }
}

ȽϹ£Ƚߵ declarationOrderInAspect ֵ֮һΪ after ֪ͨdeclarationOrderInAspect ȼߣ߶ after ֪ͨdeclarationOrderInAspect Сȼߡ

declarationOrderInAspect ʲôأһСᵽ advisor.size()£

ReflectiveAspectJAdvisorFactory

public List<Advisor> getAdvisors(MetadataAwareAspectInstanceFactory aspectInstanceFactory) {
    // ʡһЩ
    ...

    List<Advisor> advisors = new ArrayList<>();
    //ȡеǿ
    for (Method method : getAdvisorMethods(aspectClass)) {
        // ǿʵadvisors.size() Ϊ 012... 
        // declarationOrderInAspect ֵõ
        Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, 
                advisors.size(), aspectName);
        if (advisor != null) {
            advisors.add(advisor);
        }
    }

    // ʡһЩ
    ...
}

رǿǣֻͬһ @Aspect ඨġ֪ͬͨ磺

@Aspect
public class AspectTest {
    @Before
    public void before1() {
        ...
    }

    @Before
    public void before2() {
        ...
    }

}

before1() before2() Ӧ advisor comparePrecedenceWithinAspect 򣬶´Ͳˣԭڲͬ @Aspect жģ

@Aspect
public class AspectTest1 {
    @Before
    public void before() {
        ...
    }

}

@Aspect
public class AspectTest2 {
    @Before
    public void before() {
        ...
    }

}

2. super.sortAdvisors

ٻعͷ super.sortAdvisors(advisors):

AspectJAwareAdvisorAutoProxyCreator

protected List<Advisor> sortAdvisors(List<Advisor> advisors) {
    ...
    else {
        return super.sortAdvisors(advisors);
    }
}

Ǹȥ

AbstractAdvisorAutoProxyCreator

 protected List<Advisor> sortAdvisors(List<Advisor> advisors) {
     AnnotationAwareOrderComparator.sort(advisors);
     return advisors;
 }

ʹõ AnnotationAwareOrderComparator.sort(advisors)ʵϣ this.advisorComparator.compare ıȽϹͲٷˡ

3. getOrder() ֵ

BeanFactoryTransactionAttributeSourceAdvisor#getOrder()

BeanFactoryTransactionAttributeSourceAdvisor û @Order/@Priorityʵ Ordered ӿڣִ˳ getOrder() ķֵӦ getOrder() £

    /**
     * ȡ order£
     * 1\. ָ orderֱӷأ
     * 2\. ȡ advisor  advice advice ʵ Ordered ӿڣ getOrder()
     * 3\. ϶㣬򷵻 Ordered.LOWEST_PRECEDENCE (ȼ)
     * @return
     */
    @Override
    public int getOrder() {
        if (this.order != null) {
            return this.order;
        }
        Advice advice = getAdvice();
        if (advice instanceof Ordered) {
            return ((Ordered) advice).getOrder();
        }
        return Ordered.LOWEST_PRECEDENCE;
    }

Ordered.LOWEST_PRECEDENCE Ϊ Integer.MAX_VALUE 2147483647ٿ BeanFactoryTransactionAttributeSourceAdvisor getOrder() صֵ

ɼBeanFactoryTransactionAttributeSourceAdvisor ִ˳Ĭϵ Integer.MAX_VALUEȵĻֵ return this.order صģ

public int getOrder() {
    // ͨȷ֣this.order Ϊnull
    if (this.order != null) {
        return this.order;
    }
    // ʡһЩ
    ...
}

ôֵǴأطڴ BeanFactoryTransactionAttributeSourceAdvisor ʱ BeanFactoryTransactionAttributeSourceAdvisor#setOrder õģ

ProxyTransactionManagementConfiguration

@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
    BeanFactoryTransactionAttributeSourceAdvisor advisor 
            = new BeanFactoryTransactionAttributeSourceAdvisor();
    advisor.setTransactionAttributeSource(transactionAttributeSource());
    advisor.setAdvice(transactionInterceptor());
    if (this.enableTx != null) {
        // ȡ @EnableTransactionManagement ע order() ֵ
        advisor.setOrder(this.enableTx.<Integer>getNumber("order"));
    }
    return advisor;
}

Ǿˣ advisor ִ˳ @EnableTransactionManagement ָ

public @interface EnableTransactionManagement {

    boolean proxyTargetClass() default false;

    AdviceMode mode() default AdviceMode.PROXY;

    /**
     * ָadvisorִ˳Ĭȼ
     */
    int order() default Ordered.LOWEST_PRECEDENCE;

}

ۣ@EnableTransactionManagement ע order() ָ advisor ִ˳

InstantiationModelAwarePointcutAdvisorImpl#getOrder()

ǰķ֪@Aspect еÿһնתΪ advisorΪ InstantiationModelAwarePointcutAdvisorImplҲʵ Ordered ӿڣִ˳Ҳ InstantiationModelAwarePointcutAdvisorImpl#getOrder() getOrder() £

InstantiationModelAwarePointcutAdvisorImpl

@Override
public int getOrder() {
    return this.aspectInstanceFactory.getOrder();
}

spring aop ֮ AnnotationAwareAspectJAutoProxyCreator ϣѾϸ method advisor ת̣ܴӴҵ aspectInstanceFactory ͣǾͲһԴˣֱͨԵķȡ aspectInstanceFactory ͣ

ӵԵĽaspectInstanceFactory Ϊ LazySingletonAspectInstanceFactoryDecoratorǸ getOrder()

LazySingletonAspectInstanceFactoryDecorator

@Override
public int getOrder() {
    return this.maaif.getOrder();
}

ȻʹõԵķʽȡ maaif ͣ

maaif Ϊ BeanFactoryAspectInstanceFactoryǼ

BeanFactoryAspectInstanceFactory

public int getOrder() {
    // this.name ָDZע @Aspect ע
    Class<?> type = this.beanFactory.getType(this.name);
    if (type != null) {
        // ʵ Ordered ӿڣ͵ getOrder() ȡ
        // PriorityOrdered  Ordered ӽӿڣҲ getOrder() Ҳȡ
        if (Ordered.class.isAssignableFrom(type) && this.beanFactory.isSingleton(this.name)) {
            return ((Ordered) this.beanFactory.getBean(this.name)).getOrder();
        }
        // 1\. Ƿ @Order ע⣬У򷵻 @Order עֵָ
        // 2\. ѯǷ @Priority ע⣬У򷵻 @Priority עֵָ
        // 3\. ϶㣬 Ordered.LOWEST_PRECEDENCEֵΪ Integer.MAX_VALUE
        return OrderUtils.getOrder(type, Ordered.LOWEST_PRECEDENCE);
    }
    return Ordered.LOWEST_PRECEDENCE;
}

ӴgetOrder() ߼£

  1. ͨƻȡ࣬ҲDZע @Aspect
  2. ʵ Ordered ӿڣ͵ getOrder() ȡأֵһǣPriorityOrdered Ordered ӽӿڣҲ getOrder() Ҳȡ
  3. ûлȡǷ @Order ע⣬У򷵻 @Order עֵָûУǷ @Priority ע⣬У򷵻 @Priority עֵָ
  4. ûлȡֵͷĬֵOrdered.LOWEST_PRECEDENCE

ˣ@Aspect ͨʵ Ordered/PriorityOrdered ӿִָȼҲͨ @Order/@Priority עִָȼ

Ҫرָ getOrder() ⲿ ֻ ǰ PriorityOrdered/@Priority Order ȼ Ordered/@Order ߡҲ˵ AspectA ע˵ @Priority``AspectB ע˵ @Order``AspectA ȼһ AspectB ߣȼע value() ֵ

4. Զȼ

Լдʱָȼأ

  1. ʵ advisorʵ Ordered ӿڣҲ advisor ϱע @Order ע⣺

    public class MyAdvisor extends AbstractBeanFactoryPointcutAdvisor implements Ordered {
    
        @Override
        public int getOrder() {
            return xxx;
        }
    
    }
    
    @Order(xxx)
    public class MyAdvisor extends AbstractBeanFactoryPointcutAdvisor {
    
        @Override
        public int getOrder() {
            return xxx;
        }
    
    }
    
    
  2. ǵ (@Aspect ע)ظ @Around/@Before/@After

    @Aspect
    public class MyAspectj {
    
        @Around("xxx")
        public Object around(ProceedingJoinPoint p){
            ...
        }
    
        @Before("xxx")
        public void before(JoinPoint p) {
            ...
        }
    
        @After("xxx")
        public void after(JoinPoint p) {
            ...
        }
    
        @AfterReturning("xxx")
        public void afterReturning(JoinPoint p) {
            ...
        }
    
        @AfterThrowing("xxx")
        public void afterThrowing(JoinPoint p) {
            ...
        }
    }
    
    

    ͬһIJ֪ͬͨspring Ѿúִ˳޴Ӹģִ˳Ϊ Around, Before, After, AfterReturning, AfterThrowing.

  3. (@Aspect ע) ظ @Around/@Before/@After ȣ£

@Aspect
public class MyAspectj {

    @Around("xxx")
    public Object around(ProceedingJoinPoint p){
        ...
    }

    @Before("xxx")
    public void before(JoinPoint p) {
        ...
    }

    @Around("xxx")
    public Object around(ProceedingJoinPoint p){
        ...
    }

    @Before("xxx")
    public void before(JoinPoint p) {
        ...
    }

}

`AspectJPrecedenceComparator#comparePrecedenceWithinAspect` ʱзõĽǣȽߵ `declarationOrderInAspect` ֵ֮һΪ `after` ֪ͨ`declarationOrderInAspect` ȼߣ߶ `after` ֪ͨ`declarationOrderInAspect` Сȼߡ `declarationOrderInAspect` ȫ jdk ķƣȻȡĸĸ `declarationOrderInAspect` Сͬ jdK 汾֮䣬Ա֤õ˳һ¡

4. (@Aspect ע) ִ˳ͨ @Order ע⣬ʵ Ordered ӿָ

@Order(xxx)
public class MyAspectj1 {
    ...
}

@Order(xxx)
public class MyAspectj2 {
    ...
}

getOrder() صֵ @Order(xxx) ֵָԽСȼԽߡ


ԭӣhttps://my.oschina.net/funcy/blog/4784828 ߸ˮƽд֮ӭָԭףҵתϵ߻Ȩҵתע