spring aop 三种代理模式
https://www.cnblogs.com/qlqwjy/p/7550609.html
aop思想: 不要去随意修改别人已经写好的代码或者方法 ,如果需要去修改 ,可以通过代理的方式来扩展该方法!
静态代理:需要自己去实现接口, 通过这个接口去实现代理对象 在需要修改原本的方法或者代码上扩展逻辑
缺点:简单来说 ……需要具体方法具体对待
动态代理 :这个不需要自己去实现接口, 因为动态代理又叫 JDK代理 因为接口JDK中生成代理对象的API代理类所在包:java.lang.reflect.Proxy
Proxy类对象中有一个方法:static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
ClassLoader loader 参数:指定当前目标对象使用类加载器,获取加载器的方法是固定的
Class<?>[] interfaces 参数:目标对象实现的接口的类型,使用泛型方式确认类型
InvocationHandler h 参数:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
new InvocationHandler() 里面有一个方法叫 invoke 运用反射执行目标对象方法
(目标对象一定要实现接口)目标对象指的是我们业务层接口 ,否则不能用动态代理
Cglib代理基于继承的方式实现(也叫子类代理),在需要代理的对象没有接口的时候, 可以当做目标对象的子类代理
实现了一个MethodInterceptor的接口 ,重写了下里面的Interceptor 包含是个参数
* 1、代理对象;2、委托类方法;3、方法参数;4、代理方法的MethodProxy对象。 * * @param o * @param method * @param objects * @param methodProxy
这里
methodProxy.invokeSuper(o, objects); 中的this指向的是目标对象中的代理对那个
methodProxy.invoke(o, objects); 中的 this 指向的是目标对象
引入功能包后,就可以在内存中动态构建子类(就是我们需要扩展的目标对象)
代理的类不能为final,否则报错
目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法.
如果方法为static,private则无法进行代理。