• 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
    方法执行之

  • 相关阅读:
    深入理解多线程(第一篇)
    企业应用架构研究系列三:应用系统集成
    启程,2022亚马逊云科技re:Invent Peter带来主题演讲
    【ROS】初识ROS
    JMeter笔记16 | 性能参数配置及测试监听
    项目管理工具需要具备的五点功能
    python基础-enumerate
    驱动开发:内核监视LoadImage映像回调
    Cadence Allegro 高亮功能的使用技巧图文教程
    外卖跑腿小程序开发如何满足不断变化的用户需求?
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127700428