动态代理是什么?





  • 动态代理是一种用于扩展对象功能的技术。它可以在运行时为一个对象创建代理,并通过代理对象对方法进行增强。

JDK 动态代理:

  1. 必须是接口,通过InvokeHandler来处理代理实例中方法调用。
  2. 使用Proxy类来创建代理对象。
  3. 只能对实现了接口的类生成代理,不能针对类。

CGLIB 动态代理:

  1. 通过自定继承的方式实现,其原理是通过字节码技术动态生成被代理类的子类。(不能对声明为final的方法进行代理)
  2. 使用Enhancer类来创建代理对象。
  3. 可以对未实现接口的类生成代理。

JDK动态代理 VS CGLIB动态代理

  • JDK动态代理只能代理实现了接口的类 VS CGLIB可以代理未实现接口的类。
  • JDK动态代理是通过反射来实现的 VS CGLIB是通过生成字节码来实现的。
  • JDK动态代理和CGLIB动态代理都是在运行期生成字节码 Commonality point
  • JDK调用代理方法,是通过反射机制调用,执行效率低 VS CGLIB是通过FastClass机制直接调用方法,执行效率高。
  • JDK(直接写Class字节码)创建效率高,CGLIB(ASM框架写Class字节码)创建效率低 VS JDK(反射)运行时效率低,CGLIB(FastClass机制直接调用)运行时的效率高。

JDK动态代理

//目标接口
public interface Target {
    void save();
}
//目标对象
public class TargetImpl implements Target {
    @Override
    public void save() {
        System.out.println("Save method");
    }
}  
//代理处理器
public class JDKProxyHandler implements InvocationHandler {
    private Object target;
    
    public JDKProxyHandler(Object target) {
        this.target = target;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Start proxy");
        Object result = method.invoke(target, args);
        System.out.println("End proxy");
        return result;
    }
}

CGLIB动态代理

//目标对象
public class Target {
    public void save() {
        System.out.println("Save method");
    }
}
//代理创建器
public class CglibProxyFactory {
    public static Object getProxy(Target target) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Target.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("Start proxy");
                Object result = proxy.invokeSuper(obj, args);
                System.out.println("End proxy");
                return result;
            }
        });
        return enhancer.create();
    }
} 

动态代理的应用场景

\使用JDK动态代理的技术使用CGLIB动态代理的技术
1Spring Cloud FeignHibernate 延迟加载
2Spring Cloud OpenFeignMyBatis 缓存
3Spring Cloud SecuritySpring 事务控制
4Spring Cloud ContractSpring Cloud Zuul
5Spring Cloud FunctionSpring Cloud Hystrix
6Spring Cloud Ribbon
7Spring Cloud Sleuth
8Spring Cloud Config
9Spring Cloud Stream
10Spring Cloud Consul
11Spring Cloud Zookeeper
12Spring Cloud Vault
13Spring Cloud Gateway
14Spring Cloud Task
15Spring Cloud Cloudfoundry
16Spring Cloud Kubernetes
17Spring Cloud Alibaba
18Spring Cloud Bus
19Spring Cloud CircuitBreaker






我的Github地址,欢迎大家加入我的开源项目,或者(在我的主页联系我)加入你们的开源项目,点点Github-Stars。

\开源项目名称依赖类型版本号描述
1spring-boot-starter-triepom1.0.0-SNAPSHOT特定需求下查询速度远超开源检索工具,innodb下B+树或者ES中倒排索引无法与之比拟.
2spring-boot-starter-triejar1.0.0-M1提供了基于SpringCloud的服务节点,可以通过Nacos注册中心进行服务发现,实现了树的动态扩容与缩容,以及服务的动态上下线。
3Data-Providerpom1.0.0-SNAPSHOT提供了多种数据源的查询,以及数据的类型同步,作为一个Jar可以依赖在其他服务上动态的提供数据。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值