jdk 动态代理的原理
jdk动态代理会动态写一个java文件(代理类 与目标类实现了同一个接口),还有一个声明类实例变量(invocationHandler)
jvm会自动生成一个Java文件 这个过程对用户不可见 这个生成类与目标类一样的接口,拥有invocationHandler这个实例变量,代理类每次调用方法 实际上都是调用这个InvocationHandler的invoke方法,在invoke方法里面加入一些横切逻辑代码即可实现aop功能。
所以我们来总结一下 spring 里面的aop原理,aop原理就是jdk动态代理或者cglib。jdk动态代理就是为目标对象(target)生成一个代理对象(proxy),通过java.lang.reflect.包里面的proxy类的静态方法 newProxyInstance 动态生成一个对象,代理对象根目标对象同样的接口,同样的方法,但是代理对象的方法的调用会委托给invocationHandler 里面的invoke方法,invoke方法里面就含有横切逻辑代码,和目标对象调用实际业务的代码。 invocationHandler里面有你想要调用的方法和目标对象,所以条用目标对象的时候采用反射机制 method.invoke(target)
cglib动态代理思想类似,动态代理生成的类继承目标类,调用方法要转到 MethodInterceptor 的intercept方法
cglib创建代理对象的几个步骤:
- 生成代理类的二进制字节码文件(借助字节码生成框架asm 生成代理类的字节码);
- 加载二进制字节码,生成Class对象( 例如使用Class.forName()方法 );
- 通过反射机制获得实例构造,并创建代理类对象
MethodInterceptor接口的 intercept方法,intercept方法里面有横切逻辑代码
总结 jdk针对接口代理 cglib针对类代理