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

Java-框架王 Spring 发布时间:2021-07-16 15:56:52 阅读数:12944 1
下文是笔者采用示例的方式讲述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.net"); // 执行新增方法 
    user.delUser("java265"); // 执行删除方法 
     } 
    } 
运行结果----
方法执行之前
正在执行添加用户方法--1
用户名称: java265 密码: www.java265.net
方法执行之后
方法执行之前
正在执行删除用户方法--2
用户名称: java265
方法执行之
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/Spring/202107/514.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者