静态代理
缺点:对于每个方法的增强都是手动完成的,非常不灵活,比如说接口一旦添加新的方法,那么目标对象和代理对象都要重新修改。
实现步骤:
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 前缀,否则部分框架解析会引起序列化错误。