spring-04-1

有问题可以留言我,虽然我也很菜

AspectJ基于xml使用见**AspectJ基于xml使用案例**

AspectJ基于注解使用对比着上面链接的博客的xml文件看

使用步骤:

  • 在xml文件中声明使用注解

  • 通过注解配置service对象和切面的对象

  • 在xml通过标签+切面类中通过注解一起配置aop

  • 自己写一个方法作为声明公共切入点,相当于xml中的声明切入点

  • 在切面类中通过注解配置切入点

  • AspectJ基于注解使用代码

一个搞了我好久错误(结合我给的代码的MyAspect类看我写的文字,也可以自己跑一下)

  • 错误描述是这样子的: org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public int example3.service.User.addUser(int)

  • 为什么会报这个错(注解和xml配置都会发生)?

  • 我是准备用后置通知的返回值输出一下service中方法的返回值,然后因为我同时写了前置通知,后置通知以及环绕通知并且都执行了,此时,注意,当我同时写了这三个并且都起作用的时候,后置通知接收到的返回值是环绕通知返回的,两个返回值都是void,默认都是null,引用类型,他俩类型是兼容的不会报错,同时也要知道,环绕通知执行放行语句Object o = pjp.proceed();的时候,这个o就是service方法的返回值, 也就是说,后置通知想获取service方法的返回值的话,就要通过环绕通知返回service方法的返回值o给后置通知,**而这个就是错误的源头了我的service方法的返回值是int,而刚开始环绕通知返回值是void,表示返回值是null,是引用类型,而int是基本类型,这个不兼容,**所以报这个错.
  • 解决办法:
  1. 直接去掉环绕通知只留下前置通知和后置通知,此时就算后置通知返回值是void也没关系,因为这个void是针对环绕通知的,不是service方法,所以是可以正确获得返回值的.

  2. 去掉前置通知和后置通知,只留下环绕通知,通过Object o = pjp.proceed();获取service的返回值,然后直接输出就成,此时环绕通知是void也没所谓,因为这个void是针对后置通知的,不是service方法,所以也是可以正确获得返回值的.

  3. 如果不动通知的话,那就将环绕通知返回类型改成和service返回类型一致,返回将o强转为该类型再返回给后置通知,就也是正确的了.

  4. 如果只是想让service方法有返回值,但是暂时不用的话,把返回值从基本类型比如int改成integer也可以.

AspectJ基于注解和基于xml时通知顺序的区别

最直接的就是直接写个例子跑一下哈哈哈哈,我觉得会不会电脑不同不一样啊你们可以试一下,例子就是上面两个例子.

service方法有/无返回值+无异常+xml时通知的顺序

	1. 前置通知
	2. 环绕通知
	3. 最终通知
	4. 环绕通知
	5. 后置通知(有异常时不会执行)

service方法有/无返回值+无异常+注解时通知的顺序

	1. 环绕通知-@Around
	2. 前置通知-@Before
	3. 环绕通知-@Around
	4. 最终通知-@After
	5. 后置通知(有异常时不会执行)-@AfterReturning
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值