AOP实现共有两种方式,即AspectJ静态代理 和 AOP动态代理
一、AspectJ静态代理
1、AspectJ是静态代理的增强,使用AspectJ编译时增强实现AOP,它会在编译阶段将AspectJ织入java字节码中,需要特定的编译器
2、代理对象和目标对象实现共同的接口,并且代理对象持有目标对象的引用
二、AOP动态代理(JDK动态代理 和 CGLIB动态代理)
Spring AOP是动态代理,AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的所有方法,并且在特定的切点做了增强处理,并回调原对象的方法
1、通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口
2、JDK动态代理的核心是实现 InvocationHandler(invoke方法)接口和 Proxy 类
1、如果目标类没有实现接口,AOP会选择使用CGLIB来动态代理目标类
2、CGLIB(Code Generation Library)是一个代码生成的类库,可以在运行时动态的生成某个类的子类(继承关系)