有问题可以留言我,虽然我也很菜
AspectJ基于xml使用见**AspectJ基于xml使用案例**
AspectJ基于注解使用对比着上面链接的博客的xml文件看
使用步骤:
在xml文件中声明使用注解
通过注解配置service对象和切面的对象
在xml通过标签+切面类中通过注解一起配置aop
自己写一个方法作为声明公共切入点,相当于xml中的声明切入点
在切面类中通过注解配置切入点
一个搞了我好久错误(结合我给的代码的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是基本类型,这个不兼容,**所以报这个错.
- 解决办法:
直接去掉环绕通知只留下前置通知和后置通知,此时就算后置通知返回值是void也没关系,因为这个void是针对环绕通知的,不是service方法,所以是可以正确获得返回值的.
去掉前置通知和后置通知,只留下环绕通知,通过
Object o = pjp.proceed();
获取service的返回值,然后直接输出就成,此时环绕通知是void也没所谓,因为这个void是针对后置通知的,不是service方法,所以也是可以正确获得返回值的.如果不动通知的话,那就将环绕通知返回类型改成和service返回类型一致,返回将
o
强转为该类型再返回给后置通知,就也是正确的了.如果只是想让service方法有返回值,但是暂时不用的话,把返回值从基本类型比如int改成integer也可以.
AspectJ基于注解和基于xml时通知顺序的区别
最直接的就是直接写个例子跑一下哈哈哈哈,我觉得会不会电脑不同不一样啊你们可以试一下,例子就是上面两个例子.
service方法有/无返回值+无异常+xml时通知的顺序
1. 前置通知
2. 环绕通知
3. 最终通知
4. 环绕通知
5. 后置通知(有异常时不会执行)
service方法有/无返回值+无异常+注解时通知的顺序
1. 环绕通知-@Around
2. 前置通知-@Before
3. 环绕通知-@Around
4. 最终通知-@After
5. 后置通知(有异常时不会执行)-@AfterReturning