Spring中的AOP知识

什么是AOP面向切面编程

  • 什么是AOP
    • Aspect Oriented Program面向切面编程,在不改变原有逻辑上增加额外的功能,比如解决系统层面的问题,或者增加新的功能
  • AOP思想把功能分两个部分,分离系统中的各种关注点
    • 核心关注点:业务的主要功能
    • 横切关注点:非核心、额外增加的功能

掌握AOP面向切面编程核心概念

  • 横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些就叫横切关注点
  • 通知Advice:在特定的切入点上执行的增强处理,有5种通知
  • 连接点JoinPoint:要用通知的地方,业务流程在运行过程中需要插入切面的具体位置,一般是方法的调用前后,全部方法都可以是连接点
  • 切入点Pointcut:不能全部方法都是连接点,通过特定的规则来筛选连接点,就是Pointcut,选中那几个你想要的方法;在程序中主要体现为书写切入点表达式(通过通配、正则表达式)过滤出特定的一组JointPoint连接点,过滤出相应的Advice将要发生的JointPoint地方
  • 切面Aspect:通常是一个类,里面定义切入点+通知,定义在什么地方、什么时间点、做什么事情;通知advice指明了时间和做的事情(前置、后置等),切入点pointcut指定在什么地方干这个事情;web接口设计中,web层-->网关层-->服务层-->数据层,每一层之间也是一个切面,对象和对象,方法和方法之间都是一个个切面
  • 目标target:目标类,真正的业务逻辑,可以在目标类不知情的条件下,增加新的功能到目标类的链路上
  • 织入weaving:把切面(某个类)应用到目标函数的过程称为织入
  • AOP代理:AOP框架创建的对象,代理就是目标对象的加强;Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB动态代理

AOP里面的通知Advice类型讲解

  • @Before前置通知:在执行目标方法之前运行
  • @After后置通知:在目标方法运行结束之后
  • @AfterReturning返回通知:在目标方法正常返回值后运行
  • @AfterThrowing异常通知:在目标方法出现异常后运行
  • @Around环绕通知:在目标方法完成前、后做增强处理,环绕通知是最重要的通知类型,像事务、日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint,需要手动执行joinPoint.procced()

AOP切入点表达式

  • 切入点表达式

    • 返回类型、方法名和参数必须写,其它项都是可选(修饰符基本省略)
    • @Pointcut("execution(* com.gen.service.impl.*.*(..))")
  • 常见匹配语法

    • *:匹配任何数量字符,单个
    • ..:匹配任何数量字符,可以多个

注解配置AOP

  • 声明切面类@Aspect(切面):通常是一个类,里面可以定义切入点和通知

    package com.gen.config;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class LogAdvice {
    
        @Pointcut("execution(* com.gen.service.impl.*.*(..))")
        public void aspect() {
    
        }
    
        @After("aspect()")
        public void afterLog(JoinPoint joinPoint) {
            System.out.println("AOP-----------");
        }
    
    }
    
  • 开启SpringAOP注解配置

    package com.gen.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    
    @Configuration
    @ComponentScan("com.gen")
    @EnableAspectJAutoProxy
    public class AnnotationAopConfig {
    }
    
posted @ 2021-05-08 16:32  Gen2021  阅读(71)  评论(0)    收藏  举报