代理模式
简介:生成目标对象的一个代理对象,防止对目标对象的直接操作。通过代理模式,我们可以间接的访问目标对象,增加目标对象的额外的一些功能代码。
类别:代理模式分为静态代理和动态代理,动态代理通常又包含JDK代理和cglib代理。
静态代理: 代理对象和目标对象实现公共的接口,通过把公共接口把目标对象聚合到代理类中,将目标对象作为参数传入到代理对象的构造函数中初始化。重写实现的公共接口的方法,
在重写的方法中通过目标对象调用其自身方法。在客户端通过代理对象调用方法的过程叫做静态代理。
uml类图展示: 目标对象:TeacherDao 代理对象:staticproxy 公共接口:ITeacherDao 客户端:client
Jdk代理(接口代理): jdk代理中和静态代理的区别在于代理对象不需要实现目标对象实现的接口,通过java反射机制调用目标对象方法的过程。代理对象的生成是通过JDK的API,动态的在内存中构建代理对象。
实现细节: 代理类所在包java.lang.reflect.Proxy
JDK实现代理只需要使用newProxyInstance方法,但是该该方法需要接收三个参数,完整的写法是:static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h).
JDK代理需要实现InvcationHandler接口,重写invoke()方法,实现增强类的前置,后置操作。
通过反射获取到的代理类对象,调用目标方法,从而实现代理。
Cglib代理:cglib代理的区别在于目标对象和代理对象都不需要实现公共的接口,而将目标对象的子类实现接口。同时需要引入4个cglib相关的jar包。
实现细节:引入4个jar包
在内存动态构建子类,注意代理的类不能为final。
目标对象如果为final static,那么就不会被拦截,即不会执行目标对象额外的业务方法。
首先需要实现MethodIntercepter()方法重写Intercepter()方法,实现增强类的前置,后置操作逻辑。
然后通过Enhancer对象设置目标类属性参数(作为生成代理类的父类),设置callBack回调的增强类参数。将获取到的目标对象,和实现MethodInterceprter()方法的增强类,通过create()方法创建代理对象。通过代理对象调用目标对象方法
jdk代理和Cglib代理的区别:
1,Jdk代理只能针对有实现接口的类进行代理。
Cglib可以针对没有实现接口的类进行代理。
2,在jdk1.8,jdk代理的效率高于Cglib.
3,cglib代理需要添加类库依赖。