虚拟代理我们学习静态代理

127 阅读2分钟

简介

  • 代理是常见的设计模式,简单的说他就是控制对一个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理 。 spring中的aop特性就是通过代理类实现的。

特点

  • 代理类对于我们使用这来说是无感知的。因为他和委托类继承同一个接口,所以我们在调用的时候方法都是一样的。只不过在代理类内部会在转发到委托类之前和之后进行相应的处理。代理分为静态代理和动态代理。而动态代理我们常见的有jdk动态代理、cglib动态代理。

静态代理

  • 所谓的静态代理就是说在编译前就产生代理类。实际上就是我们手动提供一个实现类。实现类中转发到真实对象中。下面我们简单实现下静态代理

  • 接口类


public interface UserInterface {
    /**
     * 获取用户名
     * @return
     */
    public String getUserName();

    /**
     * 注册用户
     * @param user
     */
    public void registerUser(Object user);
}

  • 真实实现类

public class UserInterfaceImpl implements UserInterface {
    @Override
    public String getUserName() {
        return "zxhtom";
    }

    @Override
    public void registerUser(Object user) {
        System.out.println("注册成功");
    }
}

  • 代理实现类

public class UserInterfaceProxy implements UserInterface {
    private UserInterface userInterface;

    public UserInterfaceProxy(UserInterface userInterface) {
        this.userInterface = userInterface;
    }

    @Override
    public String getUserName() {
        String userName = userInterface.getUserName();
        System.out.println("我拦截到用户姓名:"+userName);
        return userName;
    }

    @Override
    public void registerUser(Object user) {
        System.out.println("我不想让你注册。滚回去");
    }
}

  • 逻辑分析: 我们实现逻辑很简单。真实实现类有两个方法一个获取用户名,一个注册用户。因为这里是为了模拟所以直接输出注册用户的日志了。我们的代理实现类构造需要一个真实的实现类。方便代理他所以需要传一个真实的实现类。然后在转发到真实方法前或者后我们自定义了一些自己的行为。getUserName中我们打印了一句获取用户名的日志。registerUser直接拦截了。不进行转发。

  • Test类


public static void main(String[] args) {
        UserInterface userInterface = new UserInterfaceProxy(new UserInterfaceImpl());
        userInterface.getUserName();
        userInterface.registerUser(null);
    }

  • 日志

001.jpg

  • 小结 上面的就是静态代理。我们不难发现静态代理有个很大的问题就是代理类很多。而且代理类构造器需要真实类。总结一句话就是代码量很多。代理类必须实现接口的方法。