1. 基本原理
Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截(AspectJ静态代理框架能够实现更为高级的功能,本文不做介绍)
Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法
Spring AOP中的动态代理主要有两种方式 :
- JDK动态代理:JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是
InvocationHandler
接口和Proxy
类 - CGLIB动态代理: 如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的
- 下面将手动实现一个AOP功能(完整代码见文末)
2. JDK动态代理
1. 主要代码
1 | //1. 服务接口类 |
2. 测试结果
1 | public class HelloServiceMain { |
- 运行结果
1 | 我准备说hello |
- 可以看到是为JDK代理(com.sun.proxy.$Proxy*)
3. CGLIB动态代理
下面代码演示的是CGLIB实现动态代理,这里要用到CGLIB框架,注意导入依赖,pom.xml文件增加内容如下
1 | <!-- https://mvnrepository.com/artifact/cglib/cglib --> |
1. 主要代码
1 | //1. CGLIB代理类 |
2. 测试结果
1 | public class HelloServiceMain { |
- 运行结果
1 | 我准备说hello. |