docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/Spring探秘之AOP的执行顺序.md
spring aop ִʱ˳ģθıִеȼĽԴ̽ aop ִ˳ܡ
spring aop ֮ AnnotationAwareAspectJAutoProxyCreator ϣ spring aop ֮ AnnotationAwareAspectJAutoProxyCreator £Уݹ spring aop ִй̣һι aop
ReflectiveAspectJAdvisorFactory#getAdvisorMethods aspect е @Around/@Before/@After ȷAspectJAwareAdvisorAutoProxyCreator#sortAdvisors advisorص
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);
}
ܽ£
@Aspect еķ@Around, @Before, @After, @AfterReturning, @AfterThrowing÷ǰı仯£
ǰ
Ƿ @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...ֵںлõ
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(...)
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 Ƚϼ£
advisorComparator.compare бȽϣȽϹǽadvisor ͬһ aspect жģ comparePrecedenceWithinAspect Ƚ.this.advisorComparator.comparethis.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ȽϹ£
PriorityOrdered Ƚϣ֮Уֻһʵ PriorityOrdered ӿڣôΪ PriorityOrdered ȼߣ Ordered ĹȽϣOrdered ȽϹ
Ordered PriorityOrdered ӿڣ getOrder() ֵбȽϣֵԽСȼԽߣ@Order/@Priority ע⣬ value() ֵбȽϣֵԽСȼԽߣ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() {
...
}
}
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 ıȽϹͲٷˡ
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() £
@Aspect ࣻOrdered ӿڣ͵ getOrder() ȡأֵһǣPriorityOrdered Ordered ӽӿڣҲ getOrder() Ҳȡ@Order ע⣬У @Order עֵָûУǷ @Priority ע⣬У @Priority עֵָOrdered.LOWEST_PRECEDENCEˣ@Aspect ͨʵ Ordered/PriorityOrdered ӿִָȼҲͨ @Order/@Priority עִָȼ
Ҫرָ getOrder() ⲿ ֻ ǰ PriorityOrdered/@Priority Order ȼ Ordered/@Order ߡҲ˵ AspectA ע˵ @Priority``AspectB ע˵ @Order``AspectA ȼһ AspectB ߣȼע value() ֵ
Լдʱָȼأ
ʵ 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;
}
}
ǵ (@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.
(@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 ߸ˮƽд֮ӭָԭףҵתϵȨҵתע