腾讯云代理商机制腾讯云代理商有哪些


代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗点说,就是一个中介,比如有一个广州人,是个本地人,有两套房,他要租出去收租,但是除了收租,他还要去找租客,带租客看房,还要准备租房合同,核算水电费等等,很麻烦。这个本地人他也不想这么折腾,他只想完成他的核心业务(收钱),其他杂七杂八的事情就不想管,但是总要有人去做,那就找租房中介,也就是二手房东。二手房东就代理这个广州本地人把房子租给租客。这个道理就是这么简单。

代理模式,运用在编程里,也是这个道理,有一些非核心业务的代码,在很多地方都需要用到的逻辑,可以交给代理对象完成,程序员只需要关心核心业务的逻辑即可。

假设原来有一个接口UserService,controller层调用userService的getAllUser()方法。如下所示:

首先创建一个代理类UserServiceProxy,实现UserService接口,然后在UserServiceProxy里面创建一个成员变量userService,再写一个有参构造器来初始化userService。代码如下:

所以在controller层调用的方式就要改一下,是用代理类UserServiceProxy调用getAllUser()方法。如下:

这就是静态代理的实现思路,很简单。但是一般我们肯定是不用这种方式。因为这种方式太笨了,很容易就可以看出几个缺点。



2.第一点还不是致命的,因为JDK动态代理也是必须要定义接口;致命的是每一个你想代理的接口你都要去创建一个代理类去实现,假设有很多要代理的接口,那就创建很多代理类,这样显得很臃肿

假设还是不理解为什么要动态代理,不妨我们再多加一个支付接口PayService,这个支付接口我们也要加上日志记录。

用静态代理怎么做?很简单呀,再创建一个PayServiceProxy类不就完了吗,如果还有OrderService(订单),

WarehouseService(仓库)等等。那就要创建很多XXXServiceProxy类。如果使用动态代理,就没必要创建这么多代理类,创建一个代理类就够了!

JDK本身就带有动态代理,必须要满足一个条件,就是要有接口。原理其实和静态代理是一样的,也是用代理类去实现接口,但是代理类不是一开始就写好的,而是在程序运行时通过反射创建字节码文件然后加载到JVM。也就是动态生成的代理类对象。

很多文章给的例子都不带泛型,也可以,就是获取的代理对象需要强转一下,强转成对应的接口类。

因为返回的对象已经不是实现类的对象,而是和实现类有共同的接口类的代理类对象,所以当然只能用接口类去接收。

这也是为什么一再强调要面向接口编程的原因,因为面向接口编程可以做更多的扩展。假设是面向实现类去编程,那就不能用JDK动态代理去扩展了!

然后创建一个方法拦截器LogRecordInterceptor,要实现MethodInterceptor类,如下:

多说几句,我们都知道Spring框架有两个核心技术,一个叫控制反转IOC,另一个叫切面编程AOP。切面编程大家都很熟悉,用的就是代理模式,那么AOP实现的代理模式用的是JDK动态代理还是CLB动态代理?

最简单的,我们看Spring的事务管理,就是用代理模式实现的,如果有兴趣,其实我们自己也可以通过JDK动态代理手写实现事务管理,其实不是很难。篇幅有限,以后可以单独写一篇文章详细说明Spring的事务管理,敬请期待。更多的设计模式实战经验的分享,就关注java技术小牛吧。