從Servlet、Dubbo、Mybatis聊聊責任鏈究竟怎麼用

來源:www.cnblogs.com/lizo/p/7503862.html


責任鏈模式的定義:使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係, 將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理他為止。


這裡就不再過多的介紹什麼是責任鏈模式,主要來說說java中如何編寫。主要從下面3個框架中的代碼中介紹。


  • servlet中的filter
  • dubbo中的filter
  • mybatis中的plugin



servlet中的Filter


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


從Servlet、Dubbo、Mybatis聊聊責任鏈究竟怎麼用

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


從Servlet、Dubbo、Mybatis聊聊責任鏈究竟怎麼用



Dubbo中的Filter


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

從Servlet、Dubbo、Mybatis聊聊責任鏈究竟怎麼用

Dubbo的責任鏈就沒有類似FilterChain這樣的類吧Filter和調用Invoker結合起來,而是通過創建一個鏈表,調用的時候我們只知道第一個節點,每個節點包含了下一個調用的節點信息。


這裡的雖然Invoker封裝Filter沒有顯示的指定next,但是通過java匿名類和final的機制達到同樣的效果。

從Servlet、Dubbo、Mybatis聊聊責任鏈究竟怎麼用



Mybatis中的Plugin


Mybatis可以配置各種Plugin,無論是官方提供的還是自己定義的,Plugin和Filter類似,就在執行Sql語句的時候做一些操作。


Mybatis的責任鏈則是通過動態代理的方式,使用Plugin代理實際的Executor類。(這裡實際還使用了組合模式,因為Plugin可以嵌套代理),核心代碼如下:

從Servlet、Dubbo、Mybatis聊聊責任鏈究竟怎麼用

簡單的示意圖如下:

從Servlet、Dubbo、Mybatis聊聊責任鏈究竟怎麼用


總結


這裡簡單介紹了Servlet、Dubbo、Mybatis對責任鏈模式的不同實現手段,其中Servlet是相對比較清晰,又易於實現的方式,而Dubbo和Mybatis則適合在原有代碼基礎上,增加責任鏈模式代碼改動量最小的。


分享到:


相關文章: