如何实现JDK动态代理?案例演示JDK动态代理实现过程

JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP。

接下来,通过一个案例来演示Spring中JDK动态代理的实现过程,具体步骤如下。

(1)创建一个名为chapter03的Web项目,导入Spring框架所需JAR包到项目的lib目录中,并发布到类路径下。

(2)在src目录下,创建一个com.itheima.jdk包,在该包下创建接口UserDao,并在该接口中编写添加和删除的方法,如文件1所示。

文件1 UserDao.java

     package com.itheima.jdk;     public interface UserDao {        public void addUser();         public void deleteUser();     }

(3)在com.itheima.jdk包中,创建UserDao接口的实现类UserDaoImpl,分别实现接口中的方法,并在每个方法中添加一条输出语句,如文件2所示。

文件2 UserDaoImpl.java

     package com.itheima.jdk;     // 目标类     public class UserDaoImpl implements UserDao {         public void addUser() {             System.out.println("添加用户");         }         public void deleteUser() {             System.out.println("删除用户");         }     }

需要注意的是,本案例中会将实现类UserDaoImpl作为目标类,对其中的方法进行增强处理。

(4)在src目录下,创建一个com.itheima.aspect包,并在该包下创建切面类MyAspect,在该类中定义一个模拟权限检查的方法和一个模拟记录日志的方法,这两个方法就表示切面中的通知,如文件3所示。

文件3 MyAspect.java

     package com.itheima.aspect;     //切面类:可以存在多个通知Advice(即增强的方法)     public class MyAspect {         public void check_Permissions(){             System.out.println("模拟检查权限...");         }         public void log(){             System.out.println("模拟记录日志...");         }     }

(5)在com.itheima.jdk包下,创建代理类JdkProxy,该类需要实现InvocationHandler接口,并编写代理方法。在代理方法中,需要通过Proxy类实现动态代理,如文件4所示。

文件4 JdkProxy.java

     package com.itheima.jdk;     import java.lang.reflect.InvocationHandler;     import java.lang.reflect.Method;     import java.lang.reflect.Proxy;     import com.itheima.aspect.MyAspect;     /**      * JDK代理类      */     public class JdkProxy implements InvocationHandler{         // 声明目标类接口         private UserDao userDao;         // 创建代理方法         public  Object createProxy(UserDao userDao) {             this.userDao = userDao;             // 1.类加载器             ClassLoader classLoader = JdkProxy.class.getClassLoader();             // 2.被代理对象实现的所有接口             Class[] clazz = userDao.getClass().getInterfaces();             // 3.使用代理类,进行增强,返回的是代理后的对象             return  Proxy.newProxyInstance(classLoader,clazz,this);         }         /*          * 所有动态代理类的方法调用,都会交由invoke()方法去处理          * proxy 被代理后的对象           * method 将要被执行的方法信息(反射)           * args 执行方法时需要的参数          */         @Override         public Object invoke(Object proxy, Method method, Object[] args)                                                                      throws Throwable {             // 声明切面             MyAspect myAspect = new MyAspect();             // 前增强             myAspect.check_Permissions();             // 在目标类上调用方法,并传入参数             Object obj = method.invoke(userDao, args);             // 后增强             myAspect.log();             return obj;         }     }

在文件4中,JdkProxy类实现了InvocationHandler接口,并实现了接口中的invoke()方法,所有动态代理类所调用的方法都会交由该方法处理。在创建的代理方法createProxy()中,使用了Proxy类的newProxyInstance()方法来创建代理对象。newProxyInstance()方法中包含三个参数,其中第1个参数是当前类的类加载器,第2个参数表示的是被代理对象实现的所有接口,第3个参数this代表的就是代理类JdkProxy本身。在invoke()方法中,目标类方法执行的前后,会分别执行切面类中的check_Permissions()方法和log()方法。

(6)在com.itheima.jdk包中,创建测试类JdkTest。在该类中的main()方法中创建代理对象和目标对象,然后从代理对象中获得对目标对象userDao增强后的对象,最后调用该对象中的添加和删除方法,如文件5所示。

文件5 JdkTest.java

     package com.itheima.jdk;     public class JdkTest{         public static void main(String[] args) {             // 创建代理对象             JdkProxy jdkProxy = new JdkProxy();              // 创建目标对象             UserDao userDao= new UserDaoImpl();             // 从代理对象中获取增强后的目标对象             UserDao userDao1 = (UserDao) jdkProxy.createProxy(userDao);             // 执行方法             userDao1.addUser();             userDao1.deleteUser();         }     }

执行程序后,控制台的输出结果如图1所示。

如何实现JDK动态代理?案例演示JDK动态代理实现过程

图1 运行结果

从图1可以看出,userDao实例中的添加用户和删除用户的方法已被成功调用,并且在调用前后分别增加了检查权限和记录日志的功能。这种实现了接口的代理方式,就是Spring中的JDK动态代理。

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/263250.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年5月15日 08:30
下一篇 2023年5月16日 07:26

相关推荐

  • 小编教你动态内容的平衡有妙招。

    一个具动态内容的网站需要网页设计支持,具有动态内容的创新网站的一些关键属性包括,会员登录和密码,用于基于角色访问专用内容或访问个人数据,如个性化定价或推荐产品,成员门户需要更高;级别的安全性,例如SSL…

    2023年6月10日
    01
  • 动态网站建设制作是什么意思?

    动态网站建设制作是什么意思?这里有两种情况。接下来,IT工作室创始人王晴儿根据多年的从业经验,跟大家分享一些这块的经验!第一种:功能动态网站动态功能的网站一般是指网站里的数据都保存在数据库里,实现动态…

    2023年4月29日
    00
  • 聊聊动态虚拟主机租用怎么配置。

    动态虚拟主机租用的配置主要涉及到几个关键步骤。需要选择租用方式,常见的是“包年/包月”购买。对于服务器的选择,一般默认使用通用型S6系列云服务器,也可能随机分配到其他可用区,并配备默认的安全组和弹性公网IP…

    2024年7月14日
    00
  • 聊聊动态l2tp。

    动态L2TP(Layer 2 Tunneling Protocol,第二层隧道协议)是一种用于在IP网络上实现点对点虚拟专用网络(VPN)连接的协议,它通过在IP数据包的第二层(传输层)进行封装和解封装,实现了对原始IP数据包的透明传输,这种技…

    2024年6月18日
    00
  • 小编分享网页设计如何进行动态内容的平衡。

    一个具动态内容的网站需要网页设计支持,具有基于角色访问专用内容或访问个人数据,如个性化定价或推荐产品,成员门户需要更高级别的安全性,例如SSL加密;交互式功能,如论坛,在线聊天或表单;支付网关或安全访问在…

    2023年6月16日
    02
  • 聊聊独享ip代理是什么意思。

    在网络技术中,IP地址是每个设备在网络上的唯一标识,它用于识别和定位设备,使得数据能够在互联网上进行传输,有时候我们可能会遇到“独享IP”和“无IP分配”的概念,这两个术语在不同的上下文中可能有不同的含义。 我…

    2024年7月13日
    00
  • 今日分享eclipse导出jar包不能运行。

    您好,这个问题可能是由于导出的jar包没有包含所有必要的依赖项导致的。您可以尝试以下方法来解决这个问题:,,1. 确保您的Eclipse版本是最新的。,2. 确保您已经安装了Java Development Kit(JDK)。,3. 在Eclipse…

    2024年7月25日
    00
  • 教你云服务器部署tomcat。

    云服务器部署Tomcat,实现高效、稳定的Web应用运行环境。 云服务器怎么运行tomcat命令 在云计算时代,越来越多的企业和个人选择将应用部署在云服务器上,而Tomcat作为一款流行的Java Web服务器,被广泛应用于各种We…

    2024年7月11日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息