讲讲代理吧
总结:何为代理,现实生活中也有很场景,比如去火车站买票,你给钱到售票员 售票员帮你买票,这其实就是一种代理,代理人 售票员 ,你是被代理的人。
废话少说,代码分为 静态代理 和动态 代理,为什么会有动态代理呢,因为静态代理 要人为实现(自己手敲) 所有的方法,动态代理 只需要 写一个方法 让 代码去 实现所有的方法 ,说白了就是省事。
动态代理主要 就是 字节码增强,就是运行的时候 根据目标类(都是字节码技术,asm(效率最高,因为他跟接近底层) ,jdk自带,cglib(封装了asm),javassist),生成一个代理类,代理类 有目标类的 所有方法,然后 多态的特性 就出来了。
顺便提一下,AspectJ ,他是一种 编译时期 就直接修改 目标类(在字节码加代码)如果想深入,可以参考 我下文的链接
- Spring AOP采用动态代理的方式,在运行期生成代理类来实现AOP,不修改原类的实现
- Aspectj 使用编译期字节码织入(weave)的方式,在编译的时候,直接修改类的字节码,把所定义的切面代码逻辑插入到目标类中
不说了,代码如下:
静态代理,手动实现 所有 方法

动态代理 cglib 不需要 接口,又称 子类代理,会根据目标类 生成 子类,然后子类调用:

jdk 要接口,因为他是根据接口生成的方法,没有就生成不了,然后生成的实现类 :

调用如下:

拓展一下spring aop 实现原理,参考链接:
https://my.oschina.net/pingpangkuangmo/blog/517340
https://www.cnblogs.com/zuidongfeng/p/8707694.html
elk
浙公网安备 33010602011771号