AnnotationAwareAspectJAutoProxyCreator的父类实现了SmartInstantiationAwareBeanPostProcessor,
SmartInstantiationAwareBeanPostProcessor接口又是BeanPostProcessor的子类的子类。
所以AnnotationAwareAspectJAutoProxyCreator类会在bean实例化之前调用postProcessBeforeInstantiation()
最后实例化成一个cglib代理类。
另外,Advisor一般是没有顺序的
虽然AbstractAdvisorAutoProxyCreator类调用了对Advisors的排序,
protected List<Advisor> sortAdvisors(List<Advisor> advisors) {
OrderComparator.sort(advisors);
return advisors;
}
但我们用的注解aop的Advisor实例是InstantiationModelAwarePointcutAdvisorImpl的对象,并没有实现Ordered接口,getOrder()方法得到的是一个很大的数:
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;
}
所以得出结论是用注解的方式实现aop,是无序的;
除非显式定义一个Advisor的实现了Ordered的子类的bean,并且给order赋值:
比如可以在xml定义一个AbstractpointcutAdvisor的子类。AbstractpointcutAdvisor是实现了Ordered接口的。
而注解的方式,Advisor的对象的class是 InstantiationModelAwarePointcutAdvisorImpl