诚信为本,市场在变,诚信永远不变...
乐鱼app·(中国)在线登陆-官方入口

咨询热线

400-123-4555

NEWS

新闻资讯

热线电话:

400-123-4555
联系人:张生
传真:+86-123-4555
手机:13800113500
邮箱:admin@youweb.com
地址:广东省广州市天河区乐鱼app工业园88号
当前位置: 乐鱼app > 新闻资讯 > 公司动态

乐鱼app浅谈动态代理

发布时间:2023-10-26 丨 浏览次数:

  乐鱼app在现实生活中,代理很常见。比如,我们需要去某个地方,需要自己开车过去,但是公交车师傅的出现替代了我们自己开车的这个步骤,我们只需要乘坐公交车就可以到达我们需要到达的目的地。这就是一种代理方式。

  用自己的话总结一下:代理就是原本需要自己去完成的工作可以由一个新的替代者来完成,这就是代理的一种表现。

  比如,公司老板需要告诉所有员工明天公司福利,所有员工放假一天。如果老板自己和员工一个一个说,那么效率多低啊,这时候,如果把这件事情交给秘书来做,对老板来说,是不是就省心了很多呢。

  从图中可以看到,静态的表现形式是一个代理对象只能代理一个被代理对象,不能同时代理多个被代理对象。

  在上面,我们了解了一下什么是静态代理,一个代理只能代理一个被代理对象,这样的话,如果我们有很多个接口需要代理乐鱼app,那就得写很多个代理类了,如此繁杂的重复工作,有没有更好的方式可以替代的呢?于是,就有了动态代理。

  比如,公司老板需要招聘员工了,然后就由人事HR小姐姐来完成这项工作,但是HR小姐姐能力有限并不一定能联系上好的求职者,并且很多公司都有面临这项尴尬的问题。于是,老板把这份工作委托给了猎头,让猎头来帮忙完成这项工作。猎头可以同时为多家公司完成招聘工作,这就是动态代理的一种表现形式了。

  从上图可以看出,动态代理的表现形式即同一个代理对象可以代理多个被代理对象,不再像之前的静态代理仅约束于一个被代理对象。

  上面,JDK的动态代理已经很好的帮我们完成了代理工作,那么,CGlib动态代理又有什么好用的特征呢?

  从上面的两张图,我们可以看出,静态代理和基于JDK的动态代理的被代理类都需要实现接口,那么,如果我的类没有实现接口,但是,我想给它配置代理,那么,应该怎么实现呢?

  这时候,就轮到CGlib出场了,CGlib可以代理没有接口的类。首先乐鱼app,我们先在pom文件中引入CGlib的jar包。

  Spring的动态代理是基于JDK的动态代理和CGlib的动态代理而成的。在Spring的动态代理中,有如下配置:

  setProxyTargetClass: 它表明是否代表目标类,默认值为false,意思是代理接口,设置为true后即代理类;

  什么意思呢? 意思就是Spring的动态代理默认是基于JDK的动态代理代理接口,当设置proxyTargetClass为true后,即修改为基于CGlib的动态代理代理类。

  setOptimize: 它表明对代理生成优化策略,默认值为false乐鱼app,意思是不启用。当设置为true时,代理对象有实现接口时,则使用JDK代理, 代理对象没有实现接口时,则使用CGlib代理。

  上面我们了解了JDK动态代理和CGlib动态代理,并且知道了JDK代理只能代理有实现接口的被代理对象,而CGlib可以代理没有实现接口的被代理对象并且还可以代理有接口的被代理对象。这样比较下来,感觉CGlib代理好像百利而无一害,那么,直接用CGlib不就可以了,为啥还要使用JDK的动态代理呢?

  前辈们根据实际项目经验得知,CGlib创建代理的速度比较慢,但创建代理之后运行的速度却非常快,而JDK动态代理刚好相反。如果在运行的时候不断地用CGlib去创建代理,系统的性能会大打折扣,所以建议一般在系统初始化的时候用CGlib去创建代理,并放到Spring的ApplicationContext中以备后用。

  前面,我们讲了这么多关于动态代理的常识,那么,动态代理到底可以为我们做什么呢?难道就是像前面提到的那样,代理一个类去做这个类想做的事情吗?如果这样的话,那也太平淡了。

  在Spring中,Spring的AOP就是基于动态代理实现的,我们都知道,Spring的核心是AOP和IOC,AOP的核心即切面。在编写项目时,控制台所观察到的日志信息,其实全部都是基于AOP实现的,而AOP的核心就是动态代理。

  比如,有这样一个需求:拦截所有的service层实现类,记录每一个实现类的执行时间。按照传统的做法我们会怎么做?在每一个方法的开始添加System.currentTimeMillis()方法获取时间,并且在方法的结束添加一个System.currentTimeMillis()方法获取时间,然后将两个时间相减,来获得时间差吗?如果这样做,想想就知道这个工作量该有多么大啊。

  这时候就可以使用动态代理来实现这个需求了。使用动态代理代理所有的类,然后在代理类执行方法前添加时间记录和执行方法后添加时间记录,相减来获取时间差。这样工作量是不是就少了很多呢。其实这种工作,Spring的AOP早就已经帮我们实现好了。

  代理可以对方法进行增强,比如原来的被代理对象可以做哪些事情乐鱼app,代理类在完成这个事情的基础上,还可以完成其他的工作,这就是代理的增强。

  所谓最终增强,可以理解为我们在try{ ...} 异常的时候,使用的finally关键字,也就是一定会,在最后去执行;

  所谓引入增强,引入增强和前面的四种增强方式不同,引入增强是基于类上的,前面四种增强是基于方法的。引入增强可以对类添加一些新的方法和属性乐鱼app。

Copyright © 2012-2022 乐鱼app 版权所有
电 话:400-123-4555  手 机:13800113500  传 真:+86-123-4555  E-mail:admin@youweb.com
地 址:广东省广州市天河区乐鱼app工业园88号
黔ICP备18002036号-1

扫一扫关注大业微信公众帐号