【Spring】什么是AOP呢,又是如何实现的呢

一、概念

是面向切面编程,就是横向作用于某一层,如何理解横向呢,举个例子,就比如我们一般项目开发会分层,有控制层、业务层、数据层,我们调某个一个接口的时候,往往是从控制层到业务层,再从业务层到数据层,都是作用于某一层的某个方法,这样的结构呢是纵向,而横向呢就是某个逻辑统一作用于某一层,作用这一层的所有方法,比如只作用于业务层。

使用AOP实现的一般是不改变原来增删改的方法,给这个系统增加记录的方法,而且作用的也是一个层面的方法

二、关键点

1、切面:拦截器类,其中会定义切点以及通知
2、切点:具体拦截的某个业务点。
3、通知:切面当中的方法,声明通知方法在目标业务层的执行位置,通知类型如下:
前置通知(@Before):在目标业务方法执行之前执行
后置通知(@After ):在目标业务方法执行之后执行
返回通知(@AfterReturning):在目标业务方法返回结果之后执行
异常通知(@AfterThrowing):在目标业务方法抛出异常之后
环绕通知(@Around):功能强大,可代替以上四种通知,还可以控制目标业务方法是否执行以及何时执行

三、AOP实现原理

Spring AOP实现使用的是动态代理,所谓的动态代理,就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法,动态代理主要有两种方式:JDK动态代理和CGLIB动态代理
JDK动态代理通过“反射”来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。
CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态地生成某个类的子类。注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
动态代理就不得不说代理模式了,代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用
1、JDK动态代理具体实现原理:
(1)通过实现InvocationHandler接口创建自己的调用处理器;
(2)通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理;
(3)通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;
(4)通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入;
(5)JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法。
2、CGLib动态代理:
利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
3、两者对比:
JDK动态代理是面向接口的。
CGLib动态代理是通过字节码底层继承要代理类来实现,因此如果被代理类被final关键字所修饰,会失败。

如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);
如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值