动态代理模式
图
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

作用

  • 代理对象可以做很多真实对象做不了的事
  • 真实对象可以专注于做自己的事

与静态代理的区别

解决了代码量增大开发效率降低的问题

  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是直接写好的
  • 动态代理分为
    • 基于接口的动态代理(JDK动态代理)
    • 基于类的动态代理(cglib)
    • 基于Java字节码实现(Javasist)

示例

代理角色

/**
 * 通用动态代理类,基于JDK的接口代理
 */
public class ProxyInvocationHandler implements InvocationHandler {

    // 被代理的接口
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    // 生成得到代理类
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    // 处理代理实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO SOMETHING
        Object result = method.invoke(target, args);
        // TODO SOMETHING
        return result;
    }
    
}

使用

// 真实角色
UserServiceImpl userService = new UserServiceImpl();
// 获得代理角色
ProxyInvocationHandler pih = new ProxyInvocationHandler();
// 设置代理对象
pih.setTarget(userService);
// 动态生成代理类
UserServiceImpl proxy = (UserServiceImpl)pih.getProxy();
// 接口方法
proxy.add()