1.2.3AOP的底层原理
一.JDK的动态代理技术
1.JDK 动态代理是 AOP 底层核心实现之一,核心结论是:基于接口反射生成代理类,通过 InvocationHandler 拦截目标方法调用。
2.核心原理概述
JDK 动态代理无需预编译,运行时由 JVM 通过反射机制动态生成代理类字节码。代理类会实现目标对象的所有接口,并重写接口方法,最终将方法调用转发给 InvocationHandler 处理,从而实现横切逻辑植入。
3.关键组成部分
- InvocationHandler 接口:代理类的方法调用都会转发到该接口的 invoke () 方法,是横切逻辑的核心载体。
- Proxy 类:提供静态方法 newProxyInstance (),用于生成代理实例,需传入类加载器、目标接口数组、InvocationHandler 实例。
- 目标对象:必须实现至少一个接口,否则 JDK 动态代理无法生效(这是其核心限制)。
4.实现流程
- 目标对象实现业务接口,定义核心业务方法。
- 自定义 InvocationHandler 实现类,在 invoke () 方法中编写横切逻辑(如日志、事务),并通过反射调用目标方法。
- 调用 Proxy.newProxyInstance (),传入目标对象的类加载器、接口数组和自定义 InvocationHandler,生成代理实例。
- 调用代理实例的接口方法时,自动触发 InvocationHandler 的 invoke () 方法,先执行横切逻辑,再执行目标方法。
二.cglib 代理技术
CGLIB(Code Generation Library)是 AOP 底层另一种重要的代理技术,与 JDK 动态代理不同,它基于继承生成目标类的子类作为代理类,无需目标类实现接口。这种特性使其可以代理没有实现接口的类,弥补了 JDK 动态代理的局限性。
1.核心原理概述
CGLIB 通过字节码生成技术,在运行时动态生成目标类的子类(代理类),并重写目标类的非 final 方法。在重写的方法中,CGLIB 会先执行横切逻辑(如日志、事务),再调用父类(目标类)的原始方法,从而实现对目标方法的增强。
2.关键组成部分
- MethodInterceptor 接口:类似 JDK 动态代理的
InvocationHandler,是横切逻辑的核心载体。代理类的方法调用会被拦截并转发到该接口的intercept()方法。 - Enhancer 类:CGLIB 的核心工具类,用于生成代理类。通过设置父类(目标类)、回调接口(
MethodInterceptor)等参数,动态创建代理实例。 - 目标对象:可以是普通类(无需实现接口),但不能是 final 类,且被代理的方法不能是 final 方法。
3.实现流程
- 定义普通的目标类(无需实现接口),包含核心业务方法。
- 自定义
MethodInterceptor实现类,在intercept()方法中编写横切逻辑,并通过反射调用目标类的原始方法。 - 使用
Enhancer类配置代理参数:设置父类(目标类)、回调对象(自定义的MethodInterceptor)。 - 调用
Enhancer.create()生成代理实例(目标类的子类)。 - 调用代理实例的方法时,会被
MethodInterceptor拦截,先执行横切逻辑,再执行目标方法。
