中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

責任鏈模式如何在Java項目中實現

發布時間:2020-12-04 16:49:04 來源:億速云 閱讀:201 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關責任鏈模式如何在Java項目中實現,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

責任鏈模式

責任鏈模式的定義:使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系, 將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理他為止。這里就不再過多的介紹什么是責任鏈模式,主要來說說java中如何編寫。主要從下面3個框架中的代碼中介紹。

  • servlet中的filter
  • dubbo中的filter
  • mybatis中的plugin 這3個框架在實現責任鏈方式不盡相同。

servlet中的Filter

servlet中分別定義了一個 Filter和FilterChain的接口,核心代碼如下:

public final class ApplicationFilterChain implements FilterChain {
  private int pos = 0; //當前執行filter的offset
  private int n; //當前filter的數量
  private ApplicationFilterConfig[] filters; //filter配置類,通過getFilter()方法獲取Filter
  private Servlet servlet
  @Override
  public void doFilter(ServletRequest request, ServletResponse response) {
    if (pos < n) {
      ApplicationFilterConfig filterConfig = filters[pos++];
      Filter filter = filterConfig.getFilter();
      filter.doFilter(request, response, this);
    } else {
      // filter都處理完畢后,執行servlet
      servlet.service(request, response);
    }
  }
}

代碼還算簡單,結構也比較清晰,定義一個Chain,里面包含了Filter列表和servlet,達到在調用真正servlet之前進行各種filter邏輯。

責任鏈模式如何在Java項目中實現

Dubbo中的Filter

Dubbo在創建Filter的時候是另外一個方法,通過把Filter封裝成 Invoker的匿名類,通過鏈表這樣的數據結構來完成責任鏈,核心代碼如下:

private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
  Invoker<T> last = invoker;
  //只獲取滿足條件的Filter
  List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
  if (filters.size() > 0) {
    for (int i = filters.size() - 1; i >= 0; i --) {
      final Filter filter = filters.get(i);
      final Invoker<T> next = last;
      last = new Invoker<T>() {
        ...
        public Result invoke(Invocation invocation) throws RpcException {
          return filter.invoke(next, invocation);
        }
        ...
      };
    }
  }
  return last;
}

Dubbo的責任鏈就沒有類似FilterChain這樣的類吧Filter和調用Invoker結合起來,而是通過創建一個鏈表,調用的時候我們只知道第一個節點,每個節點包含了下一個調用的節點信息。 這里的雖然Invoker封裝Filter沒有顯示的指定next,但是通過java匿名類和final的機制達到同樣的效果。

責任鏈模式如何在Java項目中實現

Mybatis中的Plugin

Mybatis可以配置各種Plugin,無論是官方提供的還是自己定義的,Plugin和Filter類似,就在執行Sql語句的時候做一些操作。Mybatis的責任鏈則是通過動態代理的方式,使用Plugin代理實際的Executor類。(這里實際還使用了組合模式,因為Plugin可以嵌套代理),核心代碼如下:

public class Plugin implements InvocationHandler{
  private Object target;
  private Interceptor interceptor;
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {   
    if (滿足代理條件) {
      return interceptor.intercept(new Invocation(target, method, args));
    }
    return method.invoke(target, args);   
  }
  //對傳入的對象進行代理,可能是實際的Executor類,也可能是Plugin代理類
  public static Object wrap(Object target, Interceptor interceptor) {
    Class<&#63;> type = target.getClass();
    Class<&#63;>[] interfaces = getAllInterfaces(type, signatureMap);
    if (interfaces.length > 0) {
      return Proxy.newProxyInstance(
          type.getClassLoader(),
          interfaces,
          new Plugin(target, interceptor, signatureMap));
    }
    return target;
  }
}

 簡單的示意圖如下:

責任鏈模式如何在Java項目中實現

上述就是小編為大家分享的責任鏈模式如何在Java項目中實現了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

满洲里市| 沙坪坝区| 读书| 京山县| 辽源市| 台州市| 睢宁县| 上杭县| 怀来县| 平定县| 高邑县| 平陆县| 南川市| 将乐县| 额济纳旗| 金阳县| 遂宁市| 北安市| 陵川县| 望都县| 建水县| 白山市| 新建县| 封丘县| 汾西县| 临汾市| 乐亭县| 抚顺市| 高淳县| 浦东新区| 峨眉山市| 安仁县| 永平县| 忻城县| 长沙县| 钟祥市| 彰武县| 青河县| 通江县| 犍为县| 孝义市|