【Spring5:AOP的使用与原理解析】

Spring中AOP的应用

一、介绍

  • 不通过修改源代码的方式,在主要功能中 增加功能

image-20220721103747275

二、AOP底层原理

  1. AOP底层使用动态代理

    动态代理(设计模式):

    • 有接口情况,使用JDK动态代理

    image-20220721104437712

    • 无接口情况,使用CGLIB动态代理

      image-20220721105401602

三、术语

Class User{
	add();
	update();
}
  1. 连接点

    • 类里哪些方法可以被增强,这些方法叫连接点
    • 如:add()和update()
  2. 切入点

    • 真正被增强的方法
  3. 通知(增强)

    • 实际增强的逻辑部分

    • 多种类型

      • 前置通知
        @Before(value = "execution(* test_AOP.USER.add(..))")
        
      • 后置通知
        @AfterReturning(value = "execution(* test_AOP.USER.add(..))")
        
      • 环绕通知
        @Around(value = "execution(* test_AOP.USER.add(..))")
        
      • 异常通知
        @AfterThrowing(value = "execution(* test_AOP.USER.add(..))")
        
      • 最终通知
        @After(value = "execution(* test_AOP.USER.add(..))")
        
  4. 切面

    • 把通知应用到切入点的过程

四、AOP操作准备

  1. Spring框架一般是基于AspectJ实现Aop操作
  2. 实现类型有两种
    • 基于xml配置文件实现

    • 基于注解方式实现
  3. 引入AOP相关依赖

    image-20220722112334024

  4. 切入点表达式

    1. 作用:知道对哪个类里面的具体方法进行增强

    2. 语法结构

      execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))
      

      举例:对 Dao.UserDao类里的add方法进行增强

      //参数解释:表示public和private都可 返回类型可以省略 ..代表可变长参数
      execution(* Dao.UserDao.add(..))
      

五、AOP操作(AspectJ注解)

  1. 创建一个类里面定义方法

    package test_AOP;
    
    public class USER {
        public void add(){
            System.out.println("这是一个add方法-------");
        }
    }
    
  2. 创建增强类(编写增强逻辑)

    package test_AOP;
    
    //增强的类
    public class USER_Proxy {
        public void before(){
            System.out.println("这是在add 前执行的方法-------");
        }
    }
    
  3. 进行通知的配置

    (1)开启注解扫描

    (2)使用注解创建User和UserProxy对象

    package test_AOP;
    
    import org.springframework.stereotype.Component;
    
    @Component(value="user")//使用注解创建对象
    public class USER {
        public void add(){
            System.out.println("这是一个add方法-------");
        }
    }
    

    (3)在增强类上面加注解@Aspect

    package test_AOP;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect//生成代理对象
    //增强的类
    public class USER_Proxy {
        public void before(){
            System.out.println("这是在add 前执行的方法-------");
        }
    }
    

    (4)在Spring配置文件中开启生成代理对象

    <!--开启Aspect生成代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    

    (5)配置不同类型的通知

    • 增强类里面的通知方法上面添加通知类注解通知,使用切入点表达式

          /**
           * 前置通知
           * 表示在增强方法前执行
           */
          @Before(value = "execution(* test_AOP.USER.add(..))")
          public void before(){
              System.out.println("这是在add 前执行的方法-------");
          }
      

      (6)运行结果:

      image-20220722124508131

​ (7)结论

​ 调用该注解可以在执行add方法前执行插入的before方法

六、AOP操作(AspectJ注解 工具类)

  • 公共切入点进行抽取

//相同切入点抽取
@Pointcut(value = "execution(* test_AOP.USER.add(..))")
public void point(){}

@Before(value = "point()")
public void before(){
    System.out.println("这是在add 前执行的方法-------");
}
  • 多个增强的优先级

    增强类上加@Order(int),数字越越优先

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值