通知的执行顺序分两种:
(测试的时候只有一个相同的目标对象,并且切面类只有一个,在切面中将集中通知都写上)
1.注解方式实现通知:
环绕前置通知--》前置通知--》环绕后置通知--》后置通知--》后置返回通知
其中顺序不会跟你写的切面类中的通知顺序的变化而变化
2.在applicationContext.xml中配置通知之后的执行顺序
一,当按照如下顺序配置前置和环绕的时候
执行结果:
before…前置
around…before…环绕前置
目标方法
around…after…环绕后置
二,当按照如下顺序配置环绕和前置的时候
执行结果:
around…before…环绕前置
before…前置
目标方法
around…after…环绕后置
三,当按照如下顺序配置前置,环绕和后置的时候
执行结果:
before…前置
around…before…环绕前置
目标方法
around…after…环绕后置
after…后置
四,当按照如下顺序配置前置,环绕和后置的时候
执行结果:
before…前置
around…before…环绕前置
目标方法
after…后置
around…after…环绕后置
五,当按照如下顺序配置前置,环绕和后置的时候
执行结果:
around…before…环绕前置
before…前置
目标方法
after…后置
around…after…环绕后置
六,当按照如下顺序配置后置和后置返回的时候
执行结果:
目标方法
after…后置
afterreturning…后置返回
七,当按照如下顺序配置后置和后置返回的时候
执行结果:
目标方法
afterreturning…后置返回
after…后置
八,当按照如下顺序配置通知的时候
执行结果:
before…前置
around…before…环绕前置
目标方法
after…后置
afterreturning…后置返回
around…after…环绕后置
九,当按照如下顺序配置通知的时候
执行结果:
before…前置
around…before…环绕前置
目标方法
around…after…环绕后置
after…后置
afterreturning…后置返回
注:其他的组合方式可以自己测试一下,在配置文件中是按照顺序进行执行的,但也不是完全按照配置顺序。
测试代码:
@Test
public void test() {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
person p1=context.getBean("person",person.class);
p1.eat();
}
person类:
@Component("person")
public class person {
private int age;
public person() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("目标方法");
}
@Override
public String toString() {
return "person [age=" + age + "]";
}
}
切面类:
@Component
public class firstAspect {
public Object around(ProceedingJoinPoint pjp) throws Throwable{
person p=(person) pjp.getTarget();
System.out.println("around...before...环绕前置");
Object obj=(Integer) pjp.proceed();
System.out.println("around...after...环绕后置");
return obj;
}
public void before(JoinPoint jp){
System.out.println("before...前置");
}
public void after(JoinPoint jp){
System.out.println("after...后置");
}
public void afterReturning(JoinPoint jp){
System.out.println("afterreturning...后置返回");
}
}
配置文件一部分:
<aop:aspect ref="firstAspect">
<aop:before method="before" pointcut-ref="pc01"/>
<aop:around method="around" pointcut-ref="pc01"/>
<aop:after method="after" pointcut-ref="pc01"/>
<aop:after-returning method="afterReturning" pointcut-ref="pc01"/>
</aop:aspect>