代理模式

来源:互联网 发布:微博用户数据 编辑:程序博客网 时间:2024/06/07 00:14

代理模式


      • 代理模式
        • 概述
        • 代理模式分类
          • 静态代理模式
          • 动态代理模式
          • cglib代理
        • 参考资料


概述


代理(proxy)是一种设计模式,它提供了对目标对象另外的访问方式,即通过代理访问目标对象,这样做的好处是可以在目标对象实现的基础上,增加额外的功能操作,或者说是扩展目标对象的功能。代理模式的关键是:代理对象与目标对象。学习代理模式的原因是在Spring的AOP编程中,会用到JDK代理和cglib代理。

代理模式分类


静态代理模式

静态代理模式的特点:代理对象要实现与目标对象一样的接口,并在目标对象功能之上增加新的功能。静态代理模式的缺点是:每一个需要扩展的目标对象都对应一个代理类,这样会造成存在很多的代理类,这是其中的一个弊端,一旦接口增加方法,目标对象有代理对象都要去修改,这是静态代理的两个致命的弱点。

动态代理模式

动态代理的代理对象不需要实现接口,代理对象的生成是动态的,是利用JDK的API动态的在内存中构建代理对象,需要我们指定创建代理对象实现的接口的类型。动态代理也称为JDK代理,也可称为接口代理。动态代理参考文章: http://blog.csdn.net/jiankunking/article/details/52143504# Java的动态代理类在java.lang.reflect包下。

cglib代理

cglib代理也叫作子类代理,在内存中构建一个子类对象从而实现对目标对象功能的扩展。在Spring中用到了cglib代理,其它的代理基本不用。在使用cglib代理时,首先需要引入cglib的包,在Spring 3.x版本中,只需要引入Spring-Core的核心包即可,在该核心包中包含了cglib的包,但是在Spring 2.x中需要专门引入cglib的包。

  • 委托类(被代理的类) UserDao.java
package com.jpzhutech.cglib;public class UserDao {    public void save(){        System.out.println("保存数据");    }}
  • cglib代理类 ProxyFactory.java
package com.jpzhutech.cglib;import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;public class ProxyFactory implements MethodInterceptor {    private Object target;    public ProxyFactory(Object target) {        this.target = target;    }    public Object getProxyInstance(){        //工具类        Enhancer enhancer = new Enhancer();        //设置父类        enhancer.setSuperclass(target.getClass());        //设置回调函数        enhancer.setCallback(this);        //创建子类        return enhancer.create();    }    @Override    public Object intercept(Object obj, Method method, Object[] args,            MethodProxy proxy) throws Throwable {        System.out.println("开始事务");        Object returnValue = method.invoke(target, args);        System.out.println("提交事务");        return returnValue;    }}
  • 主类 mian.java
package com.jpzhutech.cglib;public class App {    public static void main(String[] args) {        UserDao target = new UserDao();        UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();        proxy.save();    }}

参考资料


  1. http://blog.csdn.net/jiankunking/article/details/52143504#
0 0
原创粉丝点击