aop通知的执行顺序特例

通知的执行顺序分两种:

(测试的时候只有一个相同的目标对象,并且切面类只有一个,在切面中将集中通知都写上)

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值