伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

代理模式实例

来源:本站原创 浏览:121次 时间:2021-09-22
静态代理:
public interface PersonDao {    public void savePerson();}
public class PersonDaoImpl implements PersonDao{    public void savePerson() {        System.out.println("save person");    }}
public class Transaction {    public void beginTransaction(){        System.out.println("begin transaction");    }        public void commit(){        System.out.println("commit");    }}
public class PersonDaoProxy implements PersonDao{    private PersonDao personDao;    private Transaction transaction;    public PersonDaoProxy(PersonDao personDao, Transaction transaction) {        super();        this.personDao = personDao;        this.transaction = transaction;    }    public void savePerson() {        this.transaction.beginTransaction();        this.personDao.savePerson();        this.transaction.commit();    }}
/** * 静态代理模式的缺点 *    1、只要写一个dao的是实现类就会写一个代理类 *    2、如果接口中的方法比较多,那么代理类中的方法就比较多,每个方法都需要开启事务、事务的提交 *        所以没有简化开发,没有做到业务逻辑与事务的松耦合 * @author zd * */public class StaticProxyTest {    @Test    public void testProxy(){        PersonDao personDao = new PersonDaoImpl();        Transaction transaction = new Transaction();        PersonDaoProxy proxy = new PersonDaoProxy(personDao, transaction);        proxy.savePerson();    }}
动态代理:

1.jdk动态代理(接口代理)

public interface PersonDao {    public void savePerson();    public void updatePerson();}
public class PersonDaoImpl implements PersonDao{    public void savePerson() {        System.out.println("save person");    }    public void updatePerson() {        // TODO Auto-generated method stub        System.out.println("update person");    }}
public class Transaction {    public void beginTransaction(){        System.out.println("begin transaction");    }        public void commit(){        System.out.println("commit");    }}
/** * 1、引入目标类和事务类 * 2、完成invoke * @author zd * */public class MyInterceptor implements InvocationHandler{    private Object target;    private Transaction transaction;        public MyInterceptor(Object target, Transaction transaction) {        super();        this.target = target;        this.transaction = transaction;    }    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        this.transaction.beginTransaction();        method.invoke(this.target, args);        this.transaction.commit();        return null;    }}
/** * 1、产生的代理类与接口是什么关系? *     代理类实现了接口 * 2、代理类的方法体的内容是什么? *     方法体的内容就是拦截器中invoke方法体的内容 * 3、拦截器的作用是什么? *     完成invoke方法体中的内容 * 4、拦截器中的invoke方法的参数method *     客户端调用哪个方法,method就代理哪个方法 * 5、拦截器中的invoke方法是什么? *     是代理类的方法 * @author zd * */public class JDKProxyTest {    @Test    public void testJDKProxy(){        Object target = new PersonDaoImpl();        Transaction transaction = new Transaction();        MyInterceptor interceptor = new MyInterceptor(target, transaction);        //产生代理对象        /**         * 第一个参数         *    类加载器         * 第二个参数         *    目标类实现的所有的接口         * 第三个参数         *    拦截器          */        PersonDao personDao = (PersonDao)Proxy.newProxyInstance(target.getClass().getClassLoader(),                 target.getClass().getInterfaces(), interceptor);        personDao.updatePerson();            }}

 2.cglib动态代理(子类代理)

public class Transaction {    public void beginTransaction(){        System.out.println("begin transaction");    }        public void commit(){        System.out.println("commit");    }}
public class PersonDaoImpl{    public void savePerson() {        System.out.println("save person");    }}
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class PersonDaoInterceptor implements MethodInterceptor{    private Object target;    private Transaction transact��ȫ,ƽ��ion;        public PersonDaoInterceptor(Object target, Transaction transaction) {        super();        this.target = target;        this.transaction = transaction;    }        /**     * 用来产生代理对象     */    public Object createProxy(){        Enhancer enhancer = new Enhancer();        enhancer.setCallback(this);        //设置代理类的父类        enhancer.setSuperclass(PersonDaoImpl.class);        return enhancer.create();    }    public Object intercept(Object arg0, Method method, Object[] arg2,            MethodProxy arg3) throws Throwable {        this.transaction.beginTransaction();        method.invoke(target, arg2);        this.transaction.commit();        return null;    }}
/** * 使用cglib产生的代理类,其代理类是目标类的子类 * @author zd * */public class PersonDaoTest {    @Test    public void testPersonDaoProxy(){        Object target = new PersonDaoImpl();        Transaction transaction = new Transaction();        PersonDaoInterceptor interceptor = new PersonDaoInterceptor(target, transaction);        PersonDaoImpl daoImpl = (PersonDaoImpl)interceptor.createProxy();        daoImpl.savePerson();    }}

 

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net