• Aop天花板


    拒绝废话,拒绝冗余文字,直接上代码和案例
    1 导入依赖:
    
        org.springframework.boot
        spring-boot-starter-aop
    
    2 通知类配置解释(各个配置含义在代码中解释):
    1. package com.nanfeng.aop;
    2. import org.aspectj.lang.ProceedingJoinPoint;
    3. import org.aspectj.lang.annotation.Around;
    4. import org.aspectj.lang.annotation.Aspect;
    5. import org.aspectj.lang.annotation.Pointcut;
    6. import org.aspectj.lang.reflect.MethodSignature;
    7. import org.slf4j.Logger;
    8. import org.slf4j.LoggerFactory;
    9. import org.springframework.stereotype.Component;
    10. import java.util.Arrays;
    11. @Aspect
    12. @Component
    13. public class AopAdvice {
    14. private final static Logger logger = LoggerFactory.getLogger(AopAdvice.class);
    15. /*
    16. 注意: PointCut中可以使用 && 、|| 、! 运算
    17. */
    18. /**
    19. * 自定义注解 :凡是被注解标注的方法和类都会处罚aop
    20. */
    21. @Pointcut("@annotation(com.nanfeng.aop.AopTag)")
    22. public void annotation() {
    23. }
    24. /**
    25. * 表达式:访问修饰符 返回值 包名.包名.包名…类名.方法名(参数列表)
    26. * 标准写法 :public void com.nanfeng.aop.service.AopService.executionAop()
    27. * 省略修饰符号:void com.nanfeng.aop.service.AopService.executionAop()
    28. * 返回值使用通配符: * com.nanfeng.aop.service.AopService.executionAop()
    29. * 通配符标表示: *.*.*.AopService.*()
    30. * 多包名匹配: *.*.*.AopService.*()
    31. * 参数类型匹配(根据类型匹配): *.*.*.AopService.*(int,double)
    32. * 参数通配: *.*.*.AopService.*(..)
    33. */
    34. @Pointcut("execution(* com.nanfeng.aop.service.AopService.aopExecution(..))")
    35. public void execution1() {
    36. }
    37. /**
    38. * 指定类型中的所有方法将被拦截
    39. * 不包含子类,只是针对当前对象
    40. * 包名通配方式 ..
    41. * 类名通配方式*
    42. */
    43. @Pointcut("within(com.nanfeng.aop.service.WithService)")
    44. public void with() {
    45. }
    46. /***
    47. * 类型匹配,包含子类中的所有方法(子类中扩展的方法也包含在其中)
    48. */
    49. @Pointcut("this(com.nanfeng.aop.service.ThisService)")
    50. public void thisService() {
    51. }
    52. /***
    53. * 类型匹配,包含子类中的所有方法(子类中扩展的方法也包含在其中)
    54. */
    55. @Pointcut("target(com.nanfeng.aop.service.TargetService)")
    56. public void targetService() {
    57. }
    58. /**
    59. * args() 匹配不带参数的方法
    60. * args(java.lang.String) 匹配方法参数是String类型的
    61. * ==args(…) == 带任意参数的方法
    62. * args(java.lang.String,…) 匹配第一个参数是String类型的,其他参数任意。最后一个参数是String的同理。
    63. */
    64. @Pointcut("args(..)")
    65. public void argsService() {
    66. }
    67. /**
    68. * 匹配方法带有参数com.nanfeng.aop.AopTag注解的方法
    69. */
    70. @Pointcut("@args(com.nanfeng.aop.AopTag)")
    71. public void argAnnotationsService() {
    72. }
    73. /**
    74. * 匹配bean为beanService的所有方法
    75. */
    76. @Pointcut("bean(beanService)")
    77. public void beanService() {
    78. }
    79. @Around("annotation()")
    80. public Object annotationAdvice(ProceedingJoinPoint pjp) throws Throwable {
    81. Object[] args = pjp.getArgs();
    82. Object result = pjp.proceed(args);
    83. System.out.println("annotation");
    84. return result;
    85. }
    86. @Around("execution1()")
    87. public Object executionAdvice1(ProceedingJoinPoint pjp) {
    88. Object[] args = pjp.getArgs();
    89. System.out.println(Arrays.toString(args));
    90. System.out.println("execution");
    91. Object result = null;
    92. try {
    93. result = pjp.proceed(args);
    94. } catch (Throwable e) {
    95. throw new RuntimeException(e);
    96. }
    97. return result;
    98. }
    99. @Around("with()")
    100. public Object withAdvice(ProceedingJoinPoint pjp) {
    101. Object[] args = pjp.getArgs();
    102. System.out.println(Arrays.toString(args));
    103. System.out.println("with");
    104. Object result = null;
    105. try {
    106. result = pjp.proceed(args);
    107. } catch (Throwable e) {
    108. throw new RuntimeException(e);
    109. }
    110. return result;
    111. }
    112. @Around("thisService()")
    113. public Object thisAdvice(ProceedingJoinPoint pjp) throws Throwable {
    114. //获取方法的信息
    115. MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
    116. String name = methodSignature.getMethod().getName();
    117. logger.info("thisService");
    118. //然后做一些重大操作 todo :
    119. System.out.println("method name is " + name);
    120. Object[] args = pjp.getArgs();
    121. System.out.println(Arrays.toString(args));
    122. Object result = pjp.proceed(args);
    123. return result;
    124. }
    125. @Around("targetService()")
    126. public Object targetAdvice(ProceedingJoinPoint pjp) throws Throwable {
    127. //获取方法的信息
    128. MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
    129. String name = methodSignature.getMethod().getName();
    130. logger.info(" targetService");
    131. //然后做一些重大操作 todo...................
    132. System.out.println("method name is " + name);
    133. Object[] args = pjp.getArgs();
    134. System.out.println(Arrays.toString(args));
    135. Object result = pjp.proceed(args);
    136. return result;
    137. }
    138. @Around("beanService())")
    139. public Object beanAdvice(ProceedingJoinPoint pjp) throws Throwable {
    140. //获取方法的信息
    141. MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
    142. String name = methodSignature.getMethod().getName();
    143. logger.info("beanService");
    144. //然后做一些重大操作 todo...................
    145. System.out.println("method name is " + name);
    146. Object[] args = pjp.getArgs();
    147. System.out.println(Arrays.toString(args));
    148. Object result = pjp.proceed(args);
    149. return result;
    150. }
    151. }

    3 配合通知类的service以及注解:

    1. package com.nanfeng.aop;
    2. import java.lang.annotation.ElementType;
    3. import java.lang.annotation.Retention;
    4. import java.lang.annotation.RetentionPolicy;
    5. import java.lang.annotation.Target;
    6. @Retention(RetentionPolicy.RUNTIME)
    7. @Target({ElementType.METHOD, ElementType.TYPE})
    8. public @interface AopTag {
    9. String value() default "";
    10. }
    1. package com.nanfeng.aop.service;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.nanfeng.aop.AopTag;
    4. import org.springframework.stereotype.Service;
    5. @Service
    6. public class AopService {
    7. public Object aopExecution(Object o) {
    8. return JSONObject.toJSONString(o);
    9. }
    10. @AopTag(value = "cccc")
    11. public Object annotation1(Object o) {
    12. return JSONObject.toJSONString(o);
    13. }
    14. }
    1. package com.nanfeng.aop.service;
    2. import org.springframework.stereotype.Component;
    3. @Component
    4. public class BeanService {
    5. public void bean1() {
    6. System.out.println("bean");
    7. }
    8. public void bean2() {
    9. System.out.println("bean");
    10. }
    11. }
    1. package com.nanfeng.aop.service;
    2. public interface TargetService {
    3. public Object target1(Object o);
    4. }
    1. package com.nanfeng.aop.service;
    2. import com.alibaba.fastjson.JSONObject;
    3. import org.springframework.stereotype.Service;
    4. @Service
    5. public class TargetServiceImp1 implements TargetService{
    6. @Override
    7. public Object target1(Object o) {
    8. return JSONObject.toJSONString(o);
    9. }
    10. }
    1. package com.nanfeng.aop.service;
    2. import com.alibaba.fastjson.JSONObject;
    3. import org.springframework.stereotype.Service;
    4. @Service
    5. public class TargetServiceImp2 implements TargetService {
    6. @Override
    7. public Object target1(Object o) {
    8. return JSONObject.toJSONString(o);
    9. }
    10. public Object target22(Object o) {
    11. return JSONObject.toJSONString(o);
    12. }
    13. }
    1. package com.nanfeng.aop.service;
    2. public interface ThisService {
    3. public String AopThis();
    4. }
    1. package com.nanfeng.aop.service;
    2. import org.springframework.stereotype.Component;
    3. @Component
    4. public class ThisServiceImp implements ThisService{
    5. @Override
    6. public String AopThis() {
    7. return "this aop service";
    8. }
    9. }
    1. package com.nanfeng.aop.service;
    2. import org.springframework.stereotype.Component;
    3. @Component
    4. public class ThisServiceImp1 implements ThisService{
    5. @Override
    6. public String AopThis() {
    7. return "this aop service1";
    8. }
    9. public String AopThis1() {
    10. return "this aop service2";
    11. }
    12. }
    1. package com.nanfeng.aop.service;
    2. import org.springframework.stereotype.Service;
    3. @Service
    4. public class WithService {
    5. public String aopwith() {
    6. return "31213";
    7. }
    8. }
    3 测试接口
    1. package com.nanfeng.aop;
    2. import com.nanfeng.aop.service.*;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.web.bind.annotation.PostMapping;
    5. import org.springframework.web.bind.annotation.RequestBody;
    6. import org.springframework.web.bind.annotation.RestController;
    7. @RestController
    8. public class AopController {
    9. @Autowired
    10. private AopService service;
    11. @Autowired
    12. private WithService withService;
    13. @Autowired
    14. private ThisServiceImp thisService;
    15. @Autowired
    16. private ThisServiceImp1 thisService1;
    17. @Autowired
    18. private TargetServiceImp1 target1;
    19. @Autowired
    20. private TargetServiceImp2 target2;
    21. @Autowired
    22. private BeanService beanService;
    23. @PostMapping("execution")
    24. public Object execution(@RequestBody Object o) {
    25. return service.aopExecution(o);
    26. }
    27. @PostMapping("annotation")
    28. public Object annotation1(@RequestBody Object o) {
    29. return service.annotation1(o);
    30. }
    31. @PostMapping("with")
    32. public Object with(@RequestBody Object o) {
    33. return withService.aopwith();
    34. }
    35. @PostMapping("this")
    36. public Object thisaop(@RequestBody Object o) {
    37. return thisService.AopThis() + thisService1.AopThis() + thisService1.AopThis1();
    38. }
    39. @PostMapping("target")
    40. public Object targetaop(@RequestBody Object o) {
    41. return target1.target1(o).toString() + target2.target1(o).toString() + target2.target22(o).toString();
    42. }
    43. @PostMapping("bean")
    44. public Object beanaop(@RequestBody Object o) {
    45. beanService.bean1();
    46. beanService.bean2();
    47. return o ;
    48. }
    49. }

    基本覆盖所有的aop使用方式,复制哼一声

  • 相关阅读:
    Linux安装RabbitMQ详细教程
    【Java】可变参数
    Kafka基于Kraft下的权限控制
    node.js - 上传文件至阿里云oss
    深入浅出Java多线程(八):volatile
    计算机毕业设计Java校园疫情信息管理系统(源码+系统+mysql数据库+Lw文档)
    类变量/静态变量
    公司内部培训系统搭建
    深入理解JVM(十八)GC日志分析
    Android kotlin 实现一键清理内存功能
  • 原文地址:https://blog.csdn.net/weixin_45874214/article/details/134328656