Java代理

静态代理
缺点:对于每个方法的增强都是手动完成的,非常不灵活,比如说接口一旦添加新的方法,那么目标对象和代理对象都要重新修改。
实现步骤:
1.定义一个接口及其实现类
2.创建一个代理类同样实现该接口
3.将目标对象注入代理类,然后在代理类对应的方法调用目标对象中对应的方法。这样就可以在执行方法的前后做一下想做的事情,也是方法增强。
例如:
小王想请小红来吃饭
小王先找小明,告诉他,让他去我们找小红,并带她回来吃饭,并且事成之后给小明5块钱

动态代理
相比于静态代理,动态代理更加灵活,不需要为某一个目标类都单独创建一个代理类,并且也不需要实现接口,可以直接代理实现类(CGLIB动态代理机制)
从JVM角度来说,动态代理是在运行期间动态生成类字节码文件,并加载到JVM的。SpringAOP和RPC框架的实现都离不开动态代理。
jdk动态代理
在Java动态代理机制中,invocationHandler接口和Proxy类是核心,Proxy类中使用频率最高的是newProxyInstance(),主要用于生成一个代理对象

实现步骤
1.定义一个接口及其实现类;
2.自定义 InvocationHandler 并重写invoke方法,在 invoke 方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑; 3.通过 Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 方法创建代理对象;
缺点
JDK 动态代理有一个最致命的问题是其只能代理实现了接口的类。

CGLIB动态代理
CGLIB是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。
其他MethodInterceptor接口和enhancer类是核心,需要自定义并实现MethodInterceptor接口的intercept方法

POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容