從零開始學 Java - Spring AOP 攔截器的基本實現

来源:http://www.cnblogs.com/mafly/archive/2016/09/06/SpringAOP.html
-Advertisement-
Play Games

一個程式猿在夢中解決的 Bug 沒有人是不做夢的,在所有夢的排行中,白日夢最令人傷感。不知道身為程式猿的大家,有沒有睡了一覺,然後在夢中把睡之前代碼中怎麼也搞不定的 Bug 給解決的經歷?反正我是有過。 什麼是 AOP ? AOP 為 Aspect Oriented Programming 的縮寫, ...


一個程式猿在夢中解決的 Bug

沒有人是不做夢的,在所有夢的排行中,白日夢最令人傷感。不知道身為程式猿的大家,有沒有睡了一覺,然後在夢中把睡之前代碼中怎麼也搞不定的 Bug 給解決的經歷?反正我是有過。

什麼是 AOP ?

AOP 為 Aspect Oriented Programming 的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP 是 OOP 的延續,是軟體開發中的一個熱點,也是 Spring 框架中的一個重要內容,是函數式編程的一種衍生範型。利用 AOP 可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。
以上內容引用自百度百科

翻譯為人能聽懂的話來說就是: AOP 可以理解為在方法執行前後可以去完成相同的業務邏輯,而不需要你去改業務代碼。舉個例子吧:現在有一個需求,要在項目中的每一個方法前面都輸出一句:開始執行啦! 需求很明確了,常規的解決方式就是在每個具體的方法最前面加一句system.out.print("開始執行啦!");,冒出這個想法的程式員是普通程式猿,當然,這是開個玩笑啦!這樣的代碼,如果一兩個方法用這樣的方式沒有任何問題完全可行,如果幾十個、幾百個這樣的方法呢?
這時候,我們就可以使用 AOP 來完成以上邏輯了,不需要改動任何一個方法,無侵入的方式來完成這個需求。

AOP 在實際項目中運用的場景主要有許可權管理(Authority Management)、事務管理(Transaction Management)、安全管理(Security)、日誌管理(Logging)和調試管理(Debugging)等。就是這些與業務邏輯不是很關聯密切的公共方法,我們就可以使用AOP。

Spring AOP 和 MVC 攔截器 又是什麼?

通過上面的解釋,我是知道了,AOP 其實就是可以算一種設計模式,或者說一種編程思想,而 Spring AOP 就是 Spring框架 對 AOP 這種思想進行了一系列技術實現和封裝,讓我們只需要配置一下就可以達到這個模式,在配置文件中使用<aop:config>元素。那MVC 攔截器又是什麼鬼呢?可以理解為是 Spring MVC 框架對 AOP 的一種實現方式,在配置文件中使用<mvc:interceptors>元素進行配置。這兩種方式就是實現了 AOP 的編程思想,我們只需要進行一定的配置就可以了。現在好多人也都把 Spring AOP 和 MVC 攔截器看成是一種相同的方式,都叫攔截器或AOP。

開始擼一下代碼

1.新建一個TestInterceptor類繼承於HandlerInterceptorAdapter
testInterceptor.jpg

具體代碼:

package cn.mayongfa.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class TestInterceptor extends HandlerInterceptorAdapter {
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            // 請求處理完成之後
            System.out.println("請求處理完成啦!");
            super.afterCompletion(request, response, handler, ex);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            // 處理器執行完畢之後
            System.out.println("處理器執行完畢啦!");
            super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 處理器實際執行之前
            System.out.println("處理器執行之前!");
            return super.preHandle(request, response, handler);
    }
}
  • preHandle(..):它在處理器實際執行 之前 會被執行;
  • postHandle(..),它在處理器執行 完畢 以後被執行;
  • afterCompletion(..),它在 整個請求處理完成 之後被執行。
    這三個方法為各種類型的前處理和後處理需求提供了足夠的靈活性。

2.配置一下/WebContent/WEB-INF/springMVC-servlet.xml中的<mvc:interceptors>元素就可以攔截請求了。

<mvc:interceptors>
    <!-- 直接定義在mvc:interceptors根下麵的Interceptor將攔截所有的請求 -->
    <mvc:interceptor>
        <!-- 定義在mvc:interceptor下麵的表示是對特定的請求才進行攔截的 -->
        <mvc:mapping path="/api/**"/>
        <bean class="cn.mayongfa.interceptor.TestInterceptor">
        </bean>
    </mvc:interceptor>
</mvc:interceptors>

當然,你可以根據你的需求進行攔截,我這裡攔截的是api路徑下麵的所有請求。

3.測試一下
我的項目中有個 /api/user/getlist 請求,在瀏覽器輸入試一下。
apigetList.jpg

請求數據成功,看一下控制台輸出:
print.jpg

看到我們在TestInterceptor類中輸出已經列印出來,這就是Spring AOP 攔截器的基本實現。到這裡,你應該明白瞭如何使用 AOP 來進行一些與業務邏輯無關且必須在代碼前後執行的一些通用方法了,這就是我理解 AOP 的作用吧。具體代碼請訪問GitHub:
https://github.com/mafly/SpringDemo


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近研究程式的優化,壓縮html可以減小html的體積,有利於提高頁面的相應速度。在webform的basepage中添加如下代碼: 具體到相應項目當中,還是需要調試以下,以免過濾需要輸出的內容。 ...
  • 對於跨平臺的.netCore來說,讓它的程式運行在Linux系統上已經成為必然,也是一種趨勢,畢竟我們的很多服務都放在linux伺服器上(redis,mongodb,myql,fastDFS,lucene),而我們希望與這些組件服務通訊,需要使用的代碼為java,python等,而這些都不是我們擅長 ...
  • 1、 將基礎類型轉為byte數組存儲 2.C#中結構體 與 位元組流 相互轉化 3. C# 結構體位元組對齊 在上述結構體與位元組流轉換第二種方法中,獲取結構體長度int size = Marshal.SizeOf(Mystruct);,並不是13,而是16。在記憶體特定類型數據結構起始地址通常有一定的對齊 ...
  • 1、toastr http://www.jq22.com/jquery-info476 2、jquery1.11.1 checkbox前端js代碼: 單獨使用attr方法checked屬性不改變,單獨使用prop方法屬性改變,頁面checkbox不打勾,兩者配合就沒問題,可能是版本問題 3、jque ...
  • 開始接觸 LINQ 序 在此之前曾發表過三篇關於 LINQ 的隨筆: 進階:《LINQ 標準查詢操作概述》(強烈推薦) 技巧:《Linq To Objects - 如何操作字元串》 和 《Linq To Objects - 如何操作文件目錄》 現在,自己打算再整理一篇關於 LINQ 入門的隨筆,也是 ...
  • DataGridView:顯示數據表,通過此控制項中可以實現連接資料庫,實現數據的增刪改查 一、後臺數據綁定: List<xxx> list = new List<xxx>(); dataGridView1.DataSource = list; //設置不自動生成列,此屬性在屬性面板中沒有 dataG ...
  • 介紹創建F#項目,F#中的模塊以及與C#項目互相引用需要註意的問題。 ...
  • 自定義可左右滑動、拖拽滑動的平面柱狀圖 在做這種樣式控制項之前,可先瀏覽我之前預研的控制項: A、自定義左右滑動ScrollViewer(可拖動滑動) B、自定義Bar柱狀圖 OK,現在說下控制項具體設計過程: 1)採用Grid佈局,這樣可以將Y軸的標題設置平均高度,X軸的柱子也可以平均。 當然X軸也會存 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...