Spring注解学习_AOP的注解方式实现

  1. AOP的注解方式实现
  2. 代码演示:日志切面编写

AOP的注解方式实现

AOP即Aspect oriented programming:

​ 基于动态代理,在程序运行期间动态地将某段代码切入指定位置进行运行的编程方式

注解方式完成切面编程的具体流程为:

  • 导入aop模块:Spring AOP:(spring-aspects)
  • 定义一个业务逻辑类,在业务逻辑运行时将日志进行打印
  • 定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知业务逻辑的运行
    • 通知方法:
      • 前置通知 @Before:在目标方法运行之前运行
      • 后置通知 @After:在目标方法运行之后运行,无论方法是否正常结束
      • 返回通知 @AfterReturning:在目标方法正常返回之后运行
      • 异常通知 @AfterThrowing:在目标方法出现异常以后运行
      • 环绕通知 @Around:动态代理,手动推进目标方法的运行,可手动地调用并获取返回值(joinPoint.proceed( ) ),可手动地在调用前调用后添加自定义逻辑
  • 给切面类的方法标注何时何地运行(通知注解)
  • 将切面类和业务逻辑类都加入到容器中
  • 必须告诉Spring哪个类是切面类(给切面类加上注解@Aspect)
  • ⭐️ ​给配置类加上 @EnableAspectJAutoProxy【开启基于注解的AOP模式】

切面编程三步走:

  1. 将业务逻辑组件和自定义的各个切面类都加入到容器中,注解方式告诉Spring哪个类是切面类(@Aspect

  2. 在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行

    (切入表达式: “execution(修饰符 返回值 全类名.方法名(参数名))”,

    ​ 比如:“execution(* *com.study.aop.MathCalculator.*(…))” )

  3. 在配置类上开启基于注解的AOP模式(@EnableAspectJAutoProxy

代码演示:日志切面编写

首先定义一个业务逻辑类:MathCalculator

public class MathCalculator {
    public double div(int x,int y){
        return (double)x/y;
    }
}

然后定义一个日志切面类:LogAspect

@Aspect
public class LogAspect {
    //抽取公共的切入点表达式
    //1.可供本类引用
    //2.可供其他的切面引用
    @Pointcut("execution(* *com.study.aop.MathCalculator.*(..))")
    public void pointCut(){}

    //普通的日志操作
//    @Before("pointCut()")
//    public void logStart(){
//        System.out.println("1111除法运算开始...参数列表为:{}");
//    }

    //加上参数JoinPoint获取运行时方法
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint){
        System.out.println(joinPoint.getSignature().getName()+"(除法运算)开始...参数列表为:{"+ Arrays.asList(joinPoint.getArgs())+"}");
    }

    @After("com.study.aop.LogAspect.pointCut()")	//也可以全类名+方法名引入其他切面类的切点
    public void logEnd(){
        System.out.println("除法云散结束...");
    }

    //注解添加returning字段获取被切入方法的返回值
    @AfterReturning(value = "pointCut()",returning = "result")
    public void logReturn(Object result){
        System.out.println("除法正常返回...运行结果是:{"+result+"}");
    }

    //注解添加throwing字段捕获被切入方法抛出的异常
    @AfterThrowing(value = "pointCut()",throwing = "e")
    public void logException(Exception e){
        System.out.println("除法抛出异常...异常为"+e.getMessage()+"");
    }
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com

文章标题:Spring注解学习_AOP的注解方式实现

文章字数:766

本文作者:梅罢葛

发布时间:2020-04-03, 18:47:08

最后更新:2020-04-05, 02:38:36

原始链接:https://qiurungeng.github.io/2020/04/03/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-AOP/
目录
×

喜欢就点赞,疼爱就打赏