Spring JDK动态代理

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

示例

下面使用 Eclipse IDE 演示 JDK 动态代理,步骤如下:

  • 创建 SpringDemo 项目,并在 src 目录下创建 net.biancheng 包。
  • 在 net.biancheng 包下创建 UserManager(用户管理接口)、UserManagerImpl(用户管理接口实现类)、MyAspect(切面类)和 JdkProxy(动态代理类)。
  • 运行 SpringDemo 项目。

UserManager 类代码如下。

package net.biancheng;

public interface UserManager {
   
    // 新增用户抽象方法
    void addUser(String userName, String password);

    // 删除用户抽象方法
    void delUser(String userName);

}

UserManagerImpl 类代码如下。

package net.biancheng;

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 net.biancheng;

public class MyAspect {
    public void myBefore() {
        System.out.println("方法执行之前");
    }

    public void myAfter() {
        System.out.println("方法执行之后");
    }
}

MyAspect 类在切面中定义了两个增强的方法,分别为 myBefore 和 myAfter。

JdkProxy 类代码如下。

package net.biancheng;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* JDK动态代理实现InvocationHandler接口
*
* @author 编程帮
*
*/
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("bianchengbang", "www.biancheng.net");    // 执行新增方法
        user.delUser("bianchengbang");    // 执行删除方法
    }
}

运行结果如下。

方法执行之前
正在执行添加用户方法
用户名称: bianchengbang 密码: www.biancheng.net
方法执行之后
方法执行之前
正在执行删除用户方法
用户名称: bianchengbang
方法执行之后

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/4596.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论