最近实现aop我想直接从controller就切的是就是切不了后来搜索相关代理模式相关文件整理如下:
一个对象不直接调用或者引用另一个对象的时候就可以应用代理模式在这两者对象之间构建一个桥梁--代理对象
如果走类做代理就要用cglib,接口就用jdk自带的Proxy+InvocationHandler
使用代理类可以在实现类的基础上进行扩展,可以在方法中动态加入代码,实现类能满足要求时可以直接用实现类,但当实现类不能满足要求,要扩展需求,根据开闭原则你又不能修改实现类代码,这时你就用动态代理类。
jdk动态代理是面向接口,对实现了接口的类生成代理( 类加载器、所有的接口,得到InvocationHandler接口的子类实例这就是JDK动态代理),底层使用反射机制
java动态代理创建对象的过程:
1、通过实现 InvocationHandler 接口创建自己的调用处理器;
2、通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
3、通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
4、通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。
jdk生成代理类详细流程:
1、遍历所有接口 2、把目标类实现的接口代表的Class对象放到Set中 3、把目标类实现的接口名称作为缓存(Map)中的key
4、根据接口的名称从缓存中获取对象 5、动态生成代理类的字节码 6、生成的代理类的字节码保存到硬盘上
7、返回字节码 8、根据代理类的字节码生成代理类的实例
cglib动态代理直接可以类对象代理,动态生成一个要代理类的子类(使用字节码技术生成代理类,最底层的是字节码Bytecode 位于字节码之上的是ASM),拦截所有父类方法的调用,顺势织入横切逻辑(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)
cglib生成代理类详细流程:
1、生成代理类的二进制字节码文件 2、加载二进制字节码,生成Class对象
3、通过反射机制获得实例构造,并创建代理类对象
静态代理中的代理类,需要我们自己写,代理类代理多个类的话就会代码量会加大