SpringJDK动态代理实现

简介: SpringJDK动态代理实现

JDK动态代理


JDK动态代理使用Proxy类里面的newProxyInstance方法创建代理对象。

Modifier and Type

Method and Description

static Object

newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。


方法里有三个参数:

第一个参数:类加载器。

第二个参数:增强方法所在类,这个类实现的接口,支持多个接口。

第三个参数:实现这个接口InvocationHandler创建代理的对象,在这个类里写增强的方法。


代码实现

(1)创建接口,定义方法。

(2)创建接口实现类,实现方法。

(3)使用Proxy类创建接口代理对象。


UserDao接口:


package com.Keafmd.spring5;
/**
 * Keafmd
 *
 * @ClassName: UserDao
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-17 20:41
 */
public interface UserDao {
    public int add(int a,int b);
    public String updat(String id);
}

UserDaoImpl实现类:


package com.Keafmd.spring5;
/**
 * Keafmd
 *
 * @ClassName: UserDaoImpl
 * @Description: 实现类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-17 20:42
 */
public class UserDaoImpl implements UserDao{
    @Override
    public int add(int a, int b) {
        System.out.println("add执行中...");
        return a+b;
    }
    @Override
    public String updat(String id) {
        System.out.println("updat执行中...");
        return id;
    }
}

JDKProxy类:


package com.Keafmd.spring5;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * Keafmd
 *
 * @ClassName: JDKProxy
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-17 20:44
 */
public class JDKProxy {
    public static void main(String[] args) {
        //创建接口实现类代理对象
        Class[] interfaces = {UserDao.class};
        /*Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                return null;
            }
        });*/
        UserDaoImpl userDao = new UserDaoImpl();
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
        System.out.println("-----------对add方法进行增强----------");
        int result = dao.add(1, 2);
        System.out.println("result:" + result);
        System.out.println("------------不增强updat方法------------");
        String res = dao.updat("Keafmd");
        System.out.println("res:" + res);
    }
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler {
    //把创建的是谁的代理对象,把谁传递过来
    //有参构造传递
    private Object obj;
    public UserDaoProxy(Object obj) {
        this.obj = obj;
    }
    //增强的逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if ("add".equals(method.getName())) { //通过判断实现对不同方法的增强
            //方法执行之前
            System.out.println("方法之前执行..." + method.getName());
            //被增强的方法执行
            Object res = method.invoke(obj, args);
            //方法执行之后
            System.out.println("方法之后执行" + obj);
            return res;
        } else { //不增强
            Object res = method.invoke(obj, args);
            return res;
        }
    }
}

输出结果:


-----------对add方法进行增强----------
方法之前执行...add
add执行中...
方法之后执行com.Keafmd.spring5.UserDaoImpl@5e481248
result:3
------------不增强updat方法------------
updat执行中...
res:Keafmd
Process finished with exit code 0

以上就是JDK动态代理的代码实现,在Spring5里面已经把动态代理的代码已经做了封装。


相关文章
|
5月前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
84 1
|
5月前
|
设计模式 运维 Java
Spring5深入浅出篇:Spring中静态代理与动态代理
Spring框架中的代理模式分为静态代理和动态代理。在JavaEE分层开发中,Service层最为重要,包含核心业务逻辑和额外功能。静态代理通过手动创建代理类来增加原始类的额外功能,但当代理类数量多时管理不便且不易于维护。动态代理则解决了这一问题,通过Spring的AOP(面向切面编程)实现,无需手动创建代理类,只需定义切点和增强(额外功能),在运行时动态生成代理对象,提高了代码的灵活性和可维护性。动态代理主要利用了JVM的字节码技术,在运行过程中创建代理类,执行完毕后随着虚拟机的结束而销毁,不会产生持久化的代理类。
|
5月前
|
设计模式 安全 Java
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
1360 1
|
5月前
|
XML Java 数据格式
浅谈基于动态代理的Spring AOP原理
浅谈基于动态代理的Spring AOP原理
49 0
|
5月前
|
Java Spring
spring AOP 代理模式
spring AOP 代理模式
|
5月前
Spring-动态代理深入了解
Spring-动态代理深入了解
58 0
|
12月前
|
Java Spring 容器
Spring AOP基础&动态代理&基于JDK动态代理实现
Spring AOP基础&动态代理&基于JDK动态代理实现
102 0
|
Java Spring
通过Spring AOP来深入理解代理模式
1. 背景描述 通常我们在项目中,都需要打印日志,方便系统的维护和排查错误的需要,如下所示。
|
设计模式 Java API
【Spring】(三)Spring框架代理模式
【Spring】(三)Spring框架代理模式
207 0
【Spring】(三)Spring框架代理模式
|
XML 安全 Java
Spring中的AOP和动态代理
Spring 除 IoC 容器外的另一个核心功能是 AOP,面向切面编程是对编程结构的另一种思考。
149 0
Spring中的AOP和动态代理