将那些与业务无关,却为业务模块共同调用的逻辑和责任(事务处理 \日志管理\权限控制)封装起来,便于减少系统的重复代码,降低模块的耦合程度,便于未来的扩展性,

实现原理

就是代理模式

SpringAop - 图1

注解实现

  1. /**
  2. * 切⾯
  3. * 切⼊点和通知的抽象 (与⾯向对象中的 类 相似)
  4. * 定义 切⼊点和通知 (切⼊点定义了要拦截哪些类的哪些⽅法,通知则定义了拦截过⽅法后要做什么)
  5. */
  6. @Component // 将对象交给IOC容器去实例化
  7. @Aspect // 声明当前类是⼀个切⾯
  8. public class LogCut {
  9. /**
  10. * 切⼊点:
  11. * 匹配规则。规定什么⽅法被拦截、需要处理什么⽅法
  12. * 定义切⼊点
  13. * @Pointcut("匹配规则")
  14. *
  15. * Aop 切⼊点表达式简介
  16. * 1. 执⾏任意公共⽅法:
  17. * execution(public *(..))
  18. * 2. 执⾏任意的set⽅法
  19. * execution(* set*(..))
  20. * 3. 执⾏com.xxxx.service包下任意类的任意⽅法
  21. * execution(* com.xxxx.service.*.*(..))
  22. * 4. 执⾏com.xxxx.service 包 以及⼦包下任意类的任意⽅法
  23. * execution(* com.xxxx.service..*.*(..))
  24. *
  25. * 注:表达式中的第⼀个* 代表的是⽅法的修饰范围
  26. * 可选值:private、protected、public (* 表示所有范围)
  27. */
  28. @Pointcut("execution (* com.xxxx.service..*.*(..) )")
  29. public void cut(){}
  30. /**
  31. * 声明前置通知 并将通知应⽤到定义的切⼊点上
  32. * ⽬标类⽅法执⾏前 执⾏该通知
  33. *
  34. */
  35. @Before(value = "cut()")
  36. public void before() {
  37. System.out.println("前置通知.....");
  38. }
  39. /**
  40. * 声明返回通知 并将通知应⽤到定义的切⼊点上
  41. * ⽬标类⽅法(⽆异常)执⾏后 执⾏该通知
  42. *
  43. */
  44. @AfterReturning(value = "cut()")
  45. public void afterReturn() {
  46. System.out.println("返回通知.....");
  47. }
  48. /**
  49. * 声明最终通知 并将通知应⽤到定义的切⼊点上
  50. * ⽬标类⽅法(⽆异常或有异常)执⾏后 执⾏该通知
  51. *
  52. */
  53. @After(value = "cut()")
  54. public void after() {
  55. System.out.println("最终通知.....");
  56. }
  57. /**
  58. * 声明异常通知 并将通知应⽤到定义的切⼊点上
  59. * ⽬标类⽅法出现异常时 执⾏该通知
  60. */
  61. @AfterThrowing(value="cut()",throwing = "e")
  62. public void afterThrow(Exception e) {
  63. System.out.println("异常通知....." + " 异常原因:" + e.getCause());
  64. }
  65. /**
  66. * 声明环绕通知 并将通知应⽤到切⼊点上
  67. * ⽅法执⾏前后 通过环绕通知定义相应处理
  68. * 需要通过显式调⽤对应的⽅法,否则⽆法访问指定⽅法 (pjp.proceed();)
  69. * @param pjp
  70. * @return
  71. */
  72. @Around(value = "cut()")
  73. public Object around(ProceedingJoinPoint pjp) {
  74. System.out.println("前置通知...");
  75. Object object = null;
  76. try {
  77. object = pjp.proceed();
  78. System.out.println(pjp.getTarget() + "======" + pjp.getSignature());
  79. // System.out.println("返回通知...");
  80. } catch (Throwable throwable) {
  81. throwable.printStackTrace();
  82. System.out.println("异常通知...");
  83. }
  84. System.out.println("最终通知...");
  85. return object;
  86. }
  87. }
  1. <!--配置AOP代理-->
  2. <aop:aspectj-autoproxy/>