Spring框架 之 代理模式

2018-03-01  本文已影响0人  Damon_Lu
在开发过程中,我们常需要在不更改原代码的前提下实现业务的扩展(也就是我们常说的OCP原则),为此,就需要用到代理模式来进行开发。
常用的代理模式有两种,静态代理和动态代理,而常用的动态代理技术又包括JDK动态代理和CGLIB动态代理。

一、静态代理
我们先来编写一个业务接口:
package proxy.part01;
/**

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**

import java.lang.reflect.Proxy;
/**

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
/**

总结:
代理模式是一种解决方案,也是一项技术,使用代理模式,我们可以在不修改原代码的情况下,完成业务的拓展,并且保证了代码的复用率和可维护性。
博主编写的这两种动态代理的实现方式略有不同,这也是博主故意为大家挖的坑,如果你仔细理解上面的两个案例,会发现其实JDK动态代理与CGLIB动态代理的实现方式只有增强代理器对象(Enhancer)的setSuperclass方法不同,其他步骤逻辑上完全相同,都需要被代理对象的类加载器、被代理对象实现的接口的Classd对象(或者所继承的父类的Class对象,也可以是本类的Class对象)、一个处理扩展业务的对象(扩展业务代码可以单独写到其他类中,也可以直接写在InvocationHandler接口的实现类中),交由API后,我们就可以获得代理对象。
这两种动态代理各有优缺点:
JDK动态代理:优点是,生成动态代理对象的速度快,适合频繁创建代理对象的程序;
缺点是,执行速度慢,且不能为未实现接口的类创建代理。
CGLIB动态代理:优点是,执行速度快,且能够为未实现接口的类创建代理;
缺点是,不能代理final修饰的方法,且生成代理对象的速度慢,不适合频繁创建代理对象的程序。
在Spring中,默认使用JDK动态代理,如果目标对象没有实现接口,会转而使用CGLIB动态代理。

上一篇 下一篇

猜你喜欢

热点阅读