Spring中的AOP @Around @Before @AfterReturning @After

转载

Spring中的AOP @Around @Before @AfterReturning @After

@Around是可以同时在所拦截方法的前后执行一段逻辑。

@Before是在所拦截方法执行之前执行一段逻辑。

@After 是在所拦截方法执行之后执行一段逻辑。

注意:不能拦截静态(static)方法

示例:


     
     
  1. package com.abc.advice;
  2. import java.util.Arrays;
  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.ProceedingJoinPoint;
  5. import org.aspectj.lang.annotation.After;
  6. import org.aspectj.lang.annotation.AfterReturning;
  7. import org.aspectj.lang.annotation.Around;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.annotation.Before;
  10. @Aspect
  11. public class AdviceTest {
  12. @Around( "execution(* com.abc.service.*.many*(..))")
  13. public Object process(ProceedingJoinPoint point) throws Throwable {
  14. System.out.println( "@Around:执行目标方法之前...");
  15. //访问目标方法的参数:
  16. Object[] args = point.getArgs();
  17. if (args != null && args.length > 0 && args[ 0].getClass() == String.class) {
  18. args[ 0] = "改变后的参数1";
  19. }
  20. //用改变后的参数执行目标方法
  21. Object returnValue = point.proceed(args);
  22. System.out.println( "@Around:执行目标方法之后...");
  23. System.out.println( "@Around:被织入的目标对象为:" + point.getTarget());
  24. return "原返回值:" + returnValue + ",这是返回结果的后缀";
  25. }
  26. @Before( "execution(* com.abc.service.*.many*(..))")
  27. public void permissionCheck(JoinPoint point) {
  28. System.out.println( "@Before:模拟权限检查...");
  29. System.out.println( "@Before:目标方法为:" +
  30. point.getSignature().getDeclaringTypeName() +
  31. "." + point.getSignature().getName());
  32. System.out.println( "@Before:参数为:" + Arrays.toString(point.getArgs()));
  33. System.out.println( "@Before:被织入的目标对象为:" + point.getTarget());
  34. }
  35. @AfterReturning(pointcut= "execution(* com.abc.service.*.many*(..))",
  36. returning= "returnValue")
  37. public void log(JoinPoint point, Object returnValue) {
  38. System.out.println( "@AfterReturning:模拟日志记录功能...");
  39. System.out.println( "@AfterReturning:目标方法为:" +
  40. point.getSignature().getDeclaringTypeName() +
  41. "." + point.getSignature().getName());
  42. System.out.println( "@AfterReturning:参数为:" +
  43. Arrays.toString(point.getArgs()));
  44. System.out.println( "@AfterReturning:返回值为:" + returnValue);
  45. System.out.println( "@AfterReturning:被织入的目标对象为:" + point.getTarget());
  46. }
  47. @After( "execution(* com.abc.service.*.many*(..))")
  48. public void releaseResource(JoinPoint point) {
  49. System.out.println( "@After:模拟释放资源...");
  50. System.out.println( "@After:目标方法为:" +
  51. point.getSignature().getDeclaringTypeName() +
  52. "." + point.getSignature().getName());
  53. System.out.println( "@After:参数为:" + Arrays.toString(point.getArgs()));
  54. System.out.println( "@After:被织入的目标对象为:" + point.getTarget());
  55. }
  56. }

被拦截的方法


     
     
  1. //将被AdviceTest的各种方法匹配
  2. public String manyAdvices(String param1, String param2) {
  3. System.out.println( "方法:manyAdvices");
  4. return param1 + " 、" + param2;
  5. }

运行方法


     
     
  1. String result = manager.manyAdvices( "aa", "bb");
  2. System.out.println( "Test方法中调用切点方法的返回值:" + result);

结果


     
     
  1. @Around:执行目标方法之前...
  2. @Before:模拟权限检查...
  3. @Before:目标方法为:com.abc.service.AdviceManager.manyAdvices
  4. @Before:参数为:[改变后的参数 1, bb]
  5. @Before:被织入的目标对象为:com.abc.service.AdviceManager@ 1dfc617e
  6. 方法:manyAdvices
  7. @Around:执行目标方法之后...
  8. @Around:被织入的目标对象为:com.abc.service.AdviceManager@ 1dfc617e
  9. @After:模拟释放资源...
  10. @After:目标方法为:com.abc.service.AdviceManager.manyAdvices
  11. @After:参数为:[改变后的参数 1, bb]
  12. @After:被织入的目标对象为:com.abc.service.AdviceManager@ 1dfc617e
  13. @AfterReturning:模拟日志记录功能...
  14. @AfterReturning:目标方法为:com.abc.service.AdviceManager.manyAdvices
  15. @AfterReturning:参数为:[改变后的参数 1, bb]
  16. @AfterReturning:返回值为:原返回值:改变后的参数 1 、 bb,这是返回结果的后缀
  17. @AfterReturning:被织入的目标对象为:com.abc.service.AdviceManager@ 1dfc617e
  18. Test方法中调用切点方法的返回值:原返回值:改变后的参数 1 、bb,这是返回结果的后缀

原文地址:https://my.oschina.net/itblog/blog/211693

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值