当前位置:首页 > CN2资讯 > 正文内容

代理模式实例代理模式

2天前CN2资讯

静态代理:

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 transaction; 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(); } }
    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24452.html

    分享给朋友:

    “代理模式实例代理模式” 的相关文章

    IP地址可以是255吗?详解IP地址的定义、结构与未来发展趋势

    IP地址的定义与作用 IP地址是互联网协议(IP)中用于标识网络上设备的逻辑地址。它就像是互联网世界的“门牌号”,帮助数据包准确地找到目的地。没有IP地址,设备之间就无法相互识别和通信。无论是电脑、手机还是服务器,只要连接到网络,都会分配一个唯一的IP地址。它的存在让互联网的运作变得有序且高效。 I...

    RackNerd主机服务评测:高性价比与卓越客户体验

    RackNerd是一家自2019年成立以来便迅速崛起的美国主机商。每当我想起这家公司,心中总是浮现出他们以高性价比著称的形象。初次接触时,我对他们的服务种类印象深刻:虚拟主机、VPS主机、独立服务器和服务器托管等。这些服务能满足不同行业和客户的需求,尤其是对预算有限的小型企业或创业者而言,RackN...

    RackNerd IP测评:选择可靠VPS的最佳指南

    在我接触过的众多VPS服务提供商中,RackNerd以其高性价比的特点脱颖而出。作为一家位于美国的公司,RackNerd专注于为用户提供可靠的虚拟私人服务器(VPS)解决方案。在这里,我将和大家分享一些关于RackNerd的重要信息,尤其是它的IP测评,我认为这对想要选择VPS的用户来说至关重要。...

    原生IP的重要性及其在外贸中的应用价值

    原生IP的定义与特点 谈到原生IP,这个概念在网络世界中显得极为重要。简单来说,原生IP是指那些与虚拟专用服务器(VPS)所在国家一致的IP地址。这意味着,它们的注册信息和其实际位置是相符的,根本没有经过修改或伪造。这一点在外贸业务中尤为重要,很多情况下,企业需要保证他们的服务器IP地址真的是注册所...

    搬瓦工DC9:高性价比VPS选择,稳定快速的服务器解决方案

    在这个快速发展的互联网时代,越来越多的人开始寻求高效、稳定的服务器解决方案。搬瓦工DC9正是为满足这种需求而推出的一款限量版VPS套餐。它不仅方便快捷,而且在性能和性价比上都表现出色,让用户在搭建网站、进行游戏或其他项目时更加省心。 搬瓦工DC9的全名是“The DC9 Plan”,每年仅需38美元...

    APT攻击是什么及其防御措施详解

    APT攻击(Advanced Persistent Threat,高级持续性威胁)是一种复杂而长期的网络攻击模式。在我了解这个概念的过程中,逐渐意识到它不仅仅是一种攻击手段,而是一个精密的、组织化的网络战争策略。APT攻击的敌对方通常具备高超的技术能力和丰富的资源,他们的目标是破坏组织的核心设施,或...