我们为Spring的某个bean配置了切面,那么Spring在创建这个bean的时候,实际上创建的是这个bean的一个代理对象,我们后续对bean中方法的调用,实际上调用的是代理类重写的代理方法。而Spring的AOP使用了两种动态代理,分别是JDK的动态代理,以及CGLib的动态代理。
-
JDK动态代理(spring优先使用)
创建InvocationHandler接口的实现类
1.被代理对象必须实现一个接口。代理对象也会实现该接口,并获得被代理对象的引用,从而实现AOP;代理对象只能织入被代理对象实现接口中的方法,如果一个方法不属于接口,那么代理对象无法进行切面(动态代理Method method是从接口获得的),且bean是以接口名字为基准的!
2.JDK动态代理是JDK原生,反射实现代理类对象速度快;
3.反射机制回调方法,速度不快。 -
CgLib
1.被代理对象不用实现接口,CgLib会在字节码层面进行方法的增强,增强后的字节码反编译后是被代理类的子类!所以子类可以对父类除private、static的方法进行重写,父类不能被final修饰。
推荐阅读: https://www.cnblogs.com/liantdev/p/10132680.html
https://www.cnblogs.com/tuyang1129/p/12878549.html