这是我参与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),就像我们的房屋中介代理,可以帮助我们做很多事情
- 这个真正的对象是这个小学生
- 左边的是给🍬人,中间是父母,右边是小学生
- 我们要是实现ProxyBean的话,需要实现InvocationHandler接口
- 而InvocationHandler中有方法invoke,实现思路可以包括两个大类
-
- 1.绑定代理对象,在里面保存拦截器/代理对象/被dialing的对象
- 2.处理代理对象的方法逻辑
- 包括了代理对象及当前方法 运行的参数和异常处理
- 其实在使用框架中,框架都帮我们已做好