Aop面向切面编程

Spring-Aop

一、什么是Aop(https://blog.csdn.net/pedro7k/article/details/115415675)

AOP(面向切面编程)

  • AOP可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。
  • 目的是并将那些影响了多个类的公共行为封装到一个可重用模块
  • 它的实际含义是在运行时将重复的代码切入到类的指定方法、指定位置上,将不同方法的同一个位置抽象为一个切面对象,并对该对象进行编程

举一个例子,比如 在业务流程中,有三个业务都有要完成相同功能的行为,如果在三个业务中都写上相同的代码,就显得很多余冗余度增大,这时候可以利用面向切面编程的思维来解决,将相同的代码写在同一个位置,再将其插入到要完成该功能的地方,这样就减少了写重复的代码降低了耦合度,又利于维护管理img

二、Aop的相关概念 (https://blog.csdn.net/q982151756/article/details/80513340)

  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码
  • Target(目标对象):织入 Advice 的目标对象.
  • proxy(代理): 应用通知的对象,详细内容参见设计模式里面的动态代理模式。
  • Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

Advice 的类型

  • 前置通知(@Before) 方法执行前调用

  • 后置通知(@After) 方法执行后调用

  • 返回通知(@AfterReturning) 方法返回后调用

  • 异常通知(@AfterThrowing)方法出现异常调用

  • (@Around) 动态代理、手动推荐方法运行

    环绕通知:
    try{
    	前置通知     
     	目标方法执行      
    	返回通知     
       }catch(){
    	异常通知     
     	}finally{
     	后置通知 
    }
    
切点表达式:
       固定语法 execution(1 2 3.4.5(6))
       1.访问修饰符
           public / private
       2.方法的返回参数类型
           Sting int void
       如果不考虑访问修饰符和返回值! 这两位整合成一起写 *
       如果要考虑不行 要么都考虑,要么都不考虑! 不能出现 * String
       3.包的位置
           具体包:com.cqie.service.Impl
           单层模糊:com.cqie.*.Impl    *单层莫模糊
           多层模糊:com..Impl   ..任意层的模糊
           细节: ..不能开头
           找所有的包Impl包: com..Impl  不能写..Impl  写成: *..Impl  ..不能开头
       4.类的名称
           具体:CalculatorPureImpl
           模糊:*
           部分模糊:*Impl
       5.方法名 语法和类名一致
     
       6.形参列表
           没有参数()
           有具体参数(String,int) 顺序有要求
           模糊参数(..)有没有参数都可以,可以有多个
           部分模糊:(String..) String后面有没有无所谓
                   (..int) 最后一个参数是int
                   (String..int)

三、实现动态代理的两种方式(https://www.wolai.com/oacbJpH1wPzGNoMAVnoELR)

JDK动态代理
操作的实现了接口的实体类,利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用 InvokeHandler来处理。

对实现了接口的类应用切面
在这里插入图片描述

CGLIB动态代理
利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

对没实现接口的类应用切面new

在这里插入图片描述

使用总结:

  • 如果目标类有接口,选择使用jdk动态代理

  • 如果目标类没有接口,选择cglib动态代理

  • 如果有接口,接口接值

  • 如果没有接口,类进行接值

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值