• Spring 如何使用JDK动态代理呢?


    转自:

    Spring 如何使用JDK动态代理呢?

    下文是笔者采用示例的方式讲述JDK动态代理的实现方法,如下所示:

    实现思路:
     Spring JDK 动态代理需要实现 InvocationHandler 接口,
     重写 invoke 方法,
      客户端使用 Java.lang.reflect.Proxy 类产生动态代理类的对象
    

    1. 创建 SpringDemo 项目
    2. 在 src 目录下创建 com.java265 包
    3. 在com.java265 包下创建 UserManager(用户管理接口)、UserManagerImpl(用户管理接口实现类)、MyAspect(切面类)和 JdkProxy(动态代理类)
    4. 运行 SpringDemo 项目

    UserManager 类

    package com.java265;
    public interface UserManager {
       
        // 新增用户抽象方法
        void addUser(String userName, String password);
        // 删除用户抽象方法
        void delUser(String userName);
    }
    

    UserManagerImpl 类

    package com.java265;
    public class UserManagerImpl implements UserManager {
        @Override
        public void addUser(String userName, String password) {
            System.out.println("正在执行添加用户方法");
            System.out.println("用户名称: " + userName + " 密码: " + password);
        }
        @Override
        public void delUser(String userName) {
            System.out.println("正在执行删除用户方法");
            System.out.println("用户名称: " + userName);
        }
    }
    

    MyAspect 类

    package com.java265;
    public class MyAspect {
        public void myBefore() {
            System.out.println("方法执行之前--1");
        }
        public void myAfter() {
            System.out.println("方法执行之后--2");
        }
    }
    
    在MyAspect 类中定义了两个增强方法如:myBefore 和 myAfter。 JdkProxy 类 
    package com.java265; 
    import java.lang.reflect.InvocationHandler; 
    import java.lang.reflect.Method; 
    import java.lang.reflect.Proxy; 
    /** 
    * JDK动态代理实现InvocationHandler接口 *
     * @author Java265.com *
     */ 
    public class JdkProxy implements InvocationHandler { 
    private Object target; // 需要代理的目标对象 
    final MyAspect myAspect = new MyAspect(); 
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
    myAspect.myBefore(); 
    Object result = method.invoke(target, args); 
    myAspect.myAfter(); 
    return result; 
    } 
    //定义获取代理对象方法 
    private Object getJDKProxy(Object targetObject) { 
    // 为目标对象target赋值 
    this.target = targetObject; 
    // JDK动态代理只能代理实现了接口的类,从 newProxyInstance 函数所需的参数就可以看出来 
    return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); 
    } 
    
    public static void main(String[] args) { 
       JdkProxy jdkProxy = new JdkProxy(); // 实例化JDKProxy对象 
        UserManager user = (UserManager) jdkProxy.getJDKProxy(new UserManagerImpl()); 
         // 获取代理对象 
        user.addUser("java265", "www.java265.com"); // 执行新增方法 
        user.delUser("java265"); // 执行删除方法 
         } 
        } 
    

    运行结果----
    方法执行之前
    正在执行添加用户方法--1
    用户名称: java265 密码: www.java265.com
    方法执行之后
    方法执行之前
    正在执行删除用户方法--2
    用户名称: java265
    方法执行之

  • 相关阅读:
    基于JavaWEB SpringBoot婚纱影楼摄影预约网站设计和实现
    经典排序——帮你解决关于排序的绝大多数问题
    【Node.js】path 模块进行路径处理
    Java程序设计2023-第三次上机测试
    CSAPP 之 DataLab 详解
    DSL风格语法(次要)_大数据培训
    leetcode 901. Online Stock Span(在线库存跨度)
    ZooKeeper的分布式锁
    图像处理之阈值分割[全局阈值、Otsu阈值和迭代式阈值分割]
    72-Java的选择排序、二分查找、Lambda表达式
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127700428