动态代理

一,动态代理快速入门

image-20240608135749883

代码实现:

//要被代理的方法接口
public interface Star {
    public String sing(String name);
    public void dance( );
}
//要被代理的类
public class BigStar implements Star{
    private String name;

    public BigStar(String name) {
        this.name = name;
    }
    public String sing(String name){
        System.out.println(this.name+"正在唱"+name);
        return "thanks";
    }
    public void dance( ){
        System.out.println(this.name+"正在跳舞");
    }
}
//代理创建的工具类
public class ProxyUtil {
    public static Star createProxy(BigStar bigStar){
        Star starProxy = (Star)Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),// 获取类加载器,一般都是获取当前类的类加载器
                new Class[]{Star.class},// 用来指定生成的代理类实现的接口
                new InvocationHandler() {//用来指定代理要做的事情
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //三个参数:
                        //proxy:代理对象
                        //method:被代理对象的方法
                        //args:被代理对象的方法的参数
                        if("sing".equals(method.getName())){
                            System.out.println("代理对象要做的事情sing");
                        }else if("dance".equals(method.getName())){
                            System.out.println("代理对象要做的事情dance");
                        }
                        return method.invoke(bigStar,args);
                    }
                }
        );
        return starProxy;
    }
}
//测试类
public class ProxyDemo {
    public static void main(String[] args) {
        BigStar star = new BigStar("周杰伦");
        Star starProxy = ProxyUtil.createProxy(star);
        String res = starProxy.sing("好日子");
        System.out.println(res);
    }
}

二,动态代理的应用场景

动态代理是一种设计模式,可以在程序运行时动态地生成代理对象,代理对象能够代替实际对象并为其提供附加功能。动态代理广泛应用于各种场景中,以下是一些常见的应用场景:

  1. AOP(面向切面编程)

    • 日志记录:在方法执行前后记录日志。

    • 性能监控:统计方法执行时间。

    • 事务管理:在方法执行前开启事务,执行完后提交或回滚事务。

    • 安全检查:在方法调用前进行权限验证。

  2. 远程调用(RPC)

    • 动态代理可以简化客户端和服务器之间的通信过程。客户端可以调用本地接口,动态代理将请求转发到远程服务器并返回结果。
  3. 懒加载(Lazy Loading)

    • 当需要延迟加载某些资源时,可以使用动态代理来控制资源的加载时机。只有在实际访问资源时,代理才会加载资源。
  4. 代理模式(Proxy Pattern)

    • 在需要为某个对象提供额外功能(如缓存、延迟初始化等)时,可以使用动态代理来封装实际对象并添加这些功能。
  5. 拦截器(Interceptor)

    • 动态代理可以用来实现拦截器,对方法调用进行拦截和处理。常用于过滤器、校验器等场景。
  6. Mock对象

    • 在单元测试中,动态代理可以用来创建Mock对象,模拟实际对象的行为,便于测试
  7. 事件处理

    • 动态代理可以用来实现事件处理机制,在事件触发时自动调用指定方法。

这些都是底层通过动态代理来实现的,我们不需要掌握如何使用它,只需要知道它即可,因为在Spring框架中一般采用AOP技术来更简便的实现动态代理的功能。

posted @ 2024-06-23 13:48  wdadwa  阅读(15)  评论(0)    收藏  举报