Files
springboot-scaffold/target/classes/com/example/scaffold/learning/AopLearningController.class

8 lines
5.2 KiB
Plaintext
Raw Normal View History

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<00>AOP0面向切面编程 (Aspect Oriented Programming) 核心概念Aspect (切面)
横切关注点的模块化 JoinPoint (连接点)!程序执行的某个特定位置Pointcut (切入点)匹配连接点的表达式Advice (通知)在切入点执行的代码Target (目标对象)被通知的对象Proxy (代理)AOP 创建的代理对象 Weaving (织入)"'将切面应用到目标对象的过程 $%& '( java/util/Mapof (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;* 通知类型,@Before.方法执行前0@After2'方法执行后(无论是否异常)4@AfterReturning6方法成功返回后8@AfterThrowing:方法抛出异常后<@Around>!环绕 - 完全控制方法执行 $@ 'A<00>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; $C 'D}(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;F语法HJexecution(修饰符? 返回类型 包名.类名.方法名(参数) 异常?)J示例LDexecution(* com.example.service.*.*(..)) - service包下所有方法NKexecution(* com.example.service..*.*(..)) - service包及子包所有方法P.execution(public * *(..)) - 所有public方法R0execution(* set*(..)) - 所有set开头的方法TOexecution(* com.example.service.UserService.*(..)) - UserService的所有方法Vb@annotation(org.springframework.transaction.annotation.Transactional) - 带@Transactional的方法 XYZ '[java/util/List~(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;] 通配符_*a匹配任意字符c..e'匹配任意层级的包或任意参数g+i匹配指定类及其子类 klm no3com/example/scaffold/learning/AopLearningControllerlogLorg/slf4j/Logger;q@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [AopLearningController] 测试方法被调用: message={} stu vworg/slf4j/Loggerinfo'(Ljava/lang/String;Ljava/lang/Object;)Vymessage{AOP 测试成功}inputtip<00>8查看控制台日志观察 AOP 通知的执行顺序<00> expectedOrder<00>1. @Around 开始<00>
2. @Before<00>3. 方法执行<00>4. @AfterReturning<00> 5. @After<00>6. @Around 结束 $<00> '<00><00>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;<00>;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [AopLearningController] 测试异常通知: error={}
<00><00><00> <00><00>java/lang/BooleanvalueOf(Z)Ljava/lang/Boolean;<00>java/lang/RuntimeException<00>6这是一个测试异常用于触发 @AfterThrowing
<00><00> <00><00><init>(Ljava/lang/String;)V<00> 正常执行<00>6传入 error=true 触发异常,观察 @AfterThrowing $<00> '<00>Y(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
<00><00><00> <00><00>java/lang/Object()V
<00><00><00> <00><00>org/slf4j/LoggerFactory getLogger%(Ljava/lang/Class;)Lorg/slf4j/Logger;concepts()Ljava/util/Map;CodeLineNumberTableLocalVariableTablethis5Lcom/example/scaffold/learning/AopLearningController; Signature7()Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;RuntimeVisibleAnnotations4Lorg/springframework/web/bind/annotation/GetMapping;value /conceptspointcutSyntax/pointcut-syntaxtestAop#(Ljava/lang/String;)Ljava/util/Map;Ljava/lang/String;MethodParametersI(Ljava/lang/String;)Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;/test"RuntimeVisibleParameterAnnotations6Lorg/springframework/web/bind/annotation/RequestParam; defaultValuetest testError(Z)Ljava/util/Map;errorZ StackMapTable8(Z)Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>; /test-errorfalse<clinit>
SourceFileAopLearningController.java8Lorg/springframework/web/bind/annotation/RestController;8Lorg/springframework/web/bind/annotation/RequestMapping;/api/learning/aop!k<00>no<00><00><00>xB   !<21>#)+-/13579;=<3D>?<3F>B<><00>";'><00> B<00><00><00><00><00><00><00>[s<00><00><00><00>` *EGIKMOQSU<>W\^`bdfh<>B<>B<><00>68#@&6<00> *<00><00><00><00><00><00><00>[s<00><00><00><00>k +<2B>jp+<2B>rxz|+~<12><12><12><12><12><12><12><12><>W<><00><><00>M O$S'O<00>+<00><00>+y<00><00>y<00><00><00><00><00>[s<00><00> <00><00>s<00><00><00><00>q(<28>j<12><1B><00><>r<1B> <0A><00>Y<12><><00><>x<12>~<12><><00><><00>cefi<00>(<00><00>(<00><00><00><00><00><00><00><00><00><00>[s<00><00> <00><00>s<00><00><00><00>/*<2A><00><><00><00> <00><00><00><00><00>! k<><00><>j<><00><00><00><00><00><00><00>[s<00>