Spring AOP注解的功能说明

打印 上一主题 下一主题

主题 913|帖子 913|积分 2739

转自:
http://www.java265.com/JavaFramework/Spring/202206/3612.html
下文笔者将通过示例的方式讲述Spring注解(AOP)的简介说明,如下所示:
  1.  
  2. package com.java265.aop;
  3. public class MathCalculator {
  4.     public int div(int i, int j){
  5.         System.out.println("MathCalculator...div...");
  6.         return  i / j;
  7.     }
  8. }
  9. 切面类
  10. package com.java265.aop;
  11. import org.aspectj.lang.JoinPoint;
  12. import org.aspectj.lang.annotation.*;
  13. import java.util.Arrays;
  14. //日志切面类
  15. @Aspect
  16. public class LogAspects {
  17.     //收取公共的切入点表达式 1.本类引用:直接写方法名+()2.其他类引用:全名
  18.     @Pointcut("execution(public int com.java265.aop.MathCalculator.div(int, int))")
  19.     public void pointCut(){}
  20.     //@Before在目标方法前切入;切入点表达式(指定在哪个方法切入);JointPoint 一定要在参数第一位
  21.     @Before("pointCut()")
  22.     public void logStart(JoinPoint joinPoint){
  23.         Object[] args = joinPoint.getArgs();
  24.         System.out.println(joinPoint.getSignature().getName() + "运行了...参数列表是:{" + Arrays.asList(args)+ "}");
  25.     }
  26.     @After("pointCut()")
  27.     public void logEnd(JoinPoint joinPoint){
  28.         System.out.println(joinPoint.getSignature().getName() + "结束了...");
  29.     }
  30.     @AfterReturning(value = "pointCut()", returning = "result")
  31.     public void  logReturn(JoinPoint joinPoint, Object result){
  32.         System.out.println(joinPoint.getSignature().getName() + "正常返回...运行结果:{" + result + "}");
  33.     }
  34.     //外部类引用切入点表达式
  35.     @AfterThrowing(value = "com.java265.aop.LogAspects.pointCut()", throwing = "e")
  36.     public void  logException(JoinPoint joinPoint, Exception e){
  37.         System.out.println(joinPoint.getSignature().getName() + "异常...异常信息:{" + e + "}");
  38.     }
  39. }
  40.  
  41. 配置类:
  42. package com.java265.config;
  43. import org.springframework.context.annotation.Bean;
  44. import org.springframework.context.annotation.Configuration;
  45. import org.springframework.context.annotation.EnableAspectJAutoProxy;
  46. import com.java265.aop.LogAspects;
  47. import com.java265.aop.MathCalculator;
  48. /**
  49. * AOP:指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;
  50. *
  51. * 1、 导入aop模块:Spring AOP
  52. * 2、 定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前,方法运行结束、出现异常等)
  53. * 3. 定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行
  54. *      通知方法:
  55. *          前置通知(@Before):logStart:在目标方法div运行之间运行
  56. *          后置通知(@After):logEnd:在目标方法div运行结束之后运行
  57. *          返回通知(@AfterReturning):logReturn:在目标方法div正常返回之后运行
  58. *          异常通知(@AfterThrowing):logException:在目标方法div出现异常以后运行
  59. *          环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())
  60. * 4. 给切面类的目标方法标注何时运行(通知注解)
  61. * 5. 将切面类和业务逻辑类(目标方法所在类)都加入到IOC容器中
  62. * 6. 必须告诉Spring哪个类是切面类(给切面类加一个注解@Aspect)
  63. * 7. 给配置类中加@EnableAspectJAutoProxy开启基于注解的aop模式
  64. */
  65. @EnableAspectJAutoProxy
  66. @Configuration
  67. public class MainConfigOfAOP {
  68.     //业务逻辑类加入容器中
  69.     @Bean
  70.     public MathCalculator mathCalculator(){
  71.         return new MathCalculator();
  72.     }
  73.     //切面类加入到容器中
  74.     @Bean
  75.     public LogAspects logAspects(){
  76.         return new LogAspects();
  77.     }
  78. }
  79.  
  80. 测试:
  81. @Test
  82. public void test01(){
  83.         AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
  84.         MathCalculator mathCalcullator = (MathCalculator) ac.getBean("mathCalculator");
  85.         mathCalcullator.div(1,1);
  86.         ac.close();
  87. }
复制代码
  1. -----运行以上代码,将输出以下信息-----
  2. div运行了...参数列表是:{[1, 1]}
  3. MathCalculator...div...
  4. div结束了...
  5. div正常返回...运行结果:{1} 
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表