代理模式:https://my.oschina.net/huangyong/blog/159788
拦截过滤器模式:Servlet 的 Filter Chain 的设计模式,它是“责任链模式”的一种变体,在 JavaEE 设计模式中命名为“拦截过滤器模式”。
https://my.oschina.net/huangyong/blog/170494
ProxyChain类
public void doProxyChain() {
if (currentProxyIndex < proxyList.size()) {
Proxy proxy = proxyList.get(currentProxyIndex++);
proxy.doProxy(this);
// proxyList.get(currentProxyIndex++).doProxy(this);
} else {
try {
methodResult = methodProxy.invokeSuper(targetObject, methodParams);
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
}
}
AbstractProxy类
注意这一点:doProxy,前两次执行的before一次是子类的before一次父类的before
public final void doProxy(ProxyChain proxyChain) {
Class<?> cls = proxyChain.getTargetClass();
Method method = proxyChain.getTargetMethod();
Object[] params = proxyChain.getMethodParams();
begin();
try {
if (filter(cls, method, params)) {
before(cls, method, params);//步骤一
proxyChain.doProxyChain(); //步骤二
after(cls, method, params); //步骤三
} else {
proxyChain.doProxyChain();
}
} catch (Throwable e) {
error(cls, method, params, e);
} finally {
end();
}
}
从ProxyChain类里开始讲起:
proxyList.get(currentProxyIndex++).doProxy(this);即
Proxy proxy = proxyList.get(currentProxyIndex++);proxy.doProxy(this);
第一次ProxyChain类里proxy.doProxy(this);
此时proxy为beforeProxy ,
执行到AbstractProxy类的doProxy里的before(步骤一),执行的是子类的before
执行AbstractProxy类的 proxyChain.doProxyChain();(步骤二)
再一次执行到ProxyChain类里proxy.doProxy(this);
此时proxy为afterProxy
再一次执行到AbstractProxy类的doProxy里的before(步骤一),此时的before不是子类的了,而是父类的,因为此时proxy为afterProxy,afterProxy里没有before,只有执行父类的before