拦截器与代理类🐣

762 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

拦截器

  • 首先介绍拦截器之前,先来一段代码热身
public interface HiService {
    public void sayHi(String name);
}
  • serive的实现层
public class HiServiceImpl implements HiService {
    @Override
    public void sayHi(String name) {
        if (null == name || name.trim() == "") {
            System.out.println("Name is null!");
        }
        System.out.println("Hi! " + name);
        
    }
}
  • 上面是简单的一个service与它的实现层
  • 下面我们来实现一个拦截器接口
public interface Interceptor {
    // 事前方法
    public boolean before();
    // 事后方法
    public void after();

    public Object around(Invocation invocation) {
        throw InvocationTargetException,IllegalAccessException;
    }
    // 是否返回方法,时间没有发生异常执行
    public  void afterReturning();

    // 事后异常方法,当时间发生异常后执行
    public  void afterThrowing();

    // 是否使用around 方法取代原有方法
    boolean useAround();
}
  • 我们可以去查看reflect包下面的源码Invocation
  • 里面最重要的是public Object proceed(),此方法是用反射的方式去调用原有的方法
  • 是使用了invoke()函数

ProxyBean

  • 代理类就是用来把服务类和拦截方法编织对应的流程中
  • 动态代理的理解:当你要给一个小学生🍬的时候,必须经过父母的同意,父母可以替这个小孩子处理一些事情,一些事情父母也可以帮助小孩子拒绝掉🙅🏻‍♀️
  • 通过以上的例子,可以看出,父母就是这个小学生的代理(proxy),就像我们的房屋中介代理,可以帮助我们做很多事情
  • 这个真正的对象是这个小学生

图片.png

  • 左边的是给🍬人,中间是父母,右边是小学生

  • 我们要是实现ProxyBean的话,需要实现InvocationHandler接口
  • 而InvocationHandler中有方法invoke,实现思路可以包括两个大类
    • 1.绑定代理对象,在里面保存拦截器/代理对象/被dialing的对象
    • 2.处理代理对象的方法逻辑
    • 包括了代理对象及当前方法 运行的参数和异常处理
    • 其实在使用框架中,框架都帮我们已做好