SpringAOP面向切麵編程

来源:https://www.cnblogs.com/SimpleWu/archive/2018/09/15/9652700.html
-Advertisement-
Play Games

Spring中三大核心思想之一AOP(面向切麵編程): 在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內 ...


Spring中三大核心思想之一AOP(面向切麵編程):

在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。 (更深入請百度) Spring 2.0在AOP上有很大的改進。首先,AOP XML的配置更加簡單了,Spring2.0引入了新的模式,支持定義從常規Java對象中發展來的切麵,充分利用了AspectJ切入點語言,提供了完整類型的Advice(也就是沒有多餘轉換和Object[] 參數操作)。另外,得意於Annotation的發展,Spring2.0提供了對@AspectJ切麵的支持,這些切麵可以在AspectJ與Spring AOP中共用,需要的僅僅是簡單的配置。   AOP機制? 使用AOP仍然需要修改所有的方法,但是修改這個方法的過程由Spring來幫我們完成    AOP通知類型:   前置通知,關鍵詞before。指的是在一個方法執行前通知。    後置通知,關鍵詞after。指的是在一個方法執行後進行通知。    環繞通知,關鍵詞around。值的是在一個方法之前與之後執行進行通知。    異常拋出後通知,throw。在一個方法執行過程中之後並且拋出異常進行通知。 操作代碼記錄:   
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
    <!-- 定義bean -->
    <bean id="stuService" class="com.lxit.aop.service.StudentService" />
    <!-- AOP配置 -->
    <!-- 添加Aspect的bean -->
    <bean id="logAspect" class="com.lxit.aop.aspect.LogAspect" />
    <aop:config>
        <!-- 定義一個pointcut -->
        <aop:pointcut id="servicepointcut" 
        expression="execution(* com.lxit.aop.service.*.*(..))" />
        <!-- 定義aspect,引用生成的aspectBean 並指定pointcut 和 method-->
        <aop:aspect id="aspect1" ref="logAspect">
            <aop:after pointcut-ref="servicepointcut" method="logAdd" />
        </aop:aspect>
    </aop:config>
</beans>
public static void main(String[] args) {
ApplicationContext ac = 
    new ClassPathXmlApplicationContext("spring.xml");
StudentService service = (StudentService) ac.getBean("stuService");
service.add();
service.getStudent();
}

異常拋出增強:

異常拋出增強的特點是在目標方法拋出異常時織入增強處理,
但是異常處理一般會需要獲取異常參數。
在配置文件中添加異常處理的aspect。
使用<aop:after-throwing來進行異常織入。

public class ExceptionAspect {
public void exceptionLog(Exception e){
    System.out.println("發生異常,寫入日誌。" + e.getMessage());
}
}
<bean id="exceptionAspect" class="com.lxit.aop.aspect.ExceptionAspect" />
<aop:config>
<!-- 定義一個pointcut -->
<aop:pointcut id="servicepointcut" 
    expression="execution(* com.lxit.aop.service.*.*(..))" />
<!-- 定義aspect,引用生成的aspectBean 並指定pointcut 和 method-->
<aop:aspect id="aspect2" ref="exceptionAspect">
    <!-- 表示當程式發生異常後才織入 -->
    <aop:after-throwing method="exceptionLog" 
         pointcut-ref="servicepointcut" throwing="e"/>
</aop:aspect>
</aop:config>

環繞增強:

 

環繞增強在目標方法的前後都可以織入增強處理
環繞增強是功能最強大的增強處理,Spring把目標方法的控制權全部交給了它
在環繞增強處理中,可以獲取或修改目標方法的參數、返回值,可以對它進行異常處理,甚至可以決定目標方法是否執行

 

public class AroundLogger {
    public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable { … } 
}
<bean id="theLogger" class="aop. AroundLogger"></bean>
<aop:config>
    <aop:pointcut id="pointcut" expression="execution(* biz.IUserBiz.*(..))" />
    <aop:aspect ref="theLogger">
        <aop:around  method="aroundLogger"  pointcut-ref="pointcut" />
    </aop:aspect>
</aop:config>

 

五中織入方式的區別:
<aop:before …>:在目標方法調用之前織入。
只要before方法執行完成,目標方法總會被調用,但before可以通過拋出異常來阻止目標方法執行,before不能訪問目標方法的返回值。

<aop:after…>:在目標方法調用之後織入。
after不能組織目標方法的執行,after不能訪問目標方法的返回值。

<aop:after-throwing..>:拋出異常時織入。如果指定throwing必須指定一個異常參數,增強方法中必須和此參數同名,類型必須大於該異常類型。

<aop:after-returning…>:在目標方法成功執行之後織入。
after-returning:不能阻止目標方法的執行,可以訪問目標方法的返回值,但不能修改。

<aop:around…>:在目標方法調用之前和調用之後織入。它的處理方法必須包含一個ProceedingJoinPoint形參。
aop:around:可以組織目標方法的執行,可以訪問目標方法的返回值,可以修改返回值。

以上增強器都可以指定args來指定參數

 

在Struts2,hibernate,Spring整合中就可以看到一種很好的效果。

在serivce層定義成一個切點在執行操作前可以開啟一系列操作,比如寫入日誌,事務等操作是一種典型的案例。

 

 

AOP使用場景

AOP用來封裝橫切關註點,具體可以在下麵的場景中使用:

Authentication 許可權 Caching 緩存 Context passing 內容傳遞 Error handling 錯誤處理 Lazy loading 懶載入

Debugging  調試 logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準 Performance optimization 性能優化

Persistence  持久化 Resource pooling 資源池 Synchronization 同步 Transactions 事務

 

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

-Advertisement-
Play Games
更多相關文章
  • 一、輸入與輸出 1.輸入 下麵一段可以把輸入的信息存在num中。 註意:輸入的信息會被認為是字元串,如果要輸入數字進行運算要先把輸入的信息進行強制類型轉換,如result = int(num) - 1 2.輸出 將輸入的num輸出。輸出時註意:如果輸出的數據不是字元串要進行強制類型轉換,如 這樣會報 ...
  • 本文摘抄了Spring事務相關的一些理論,主要講述事務的特性、事務的傳播行為、事務的隔離規則。 ...
  • 又是一篇備忘... 主要記錄一些知識,進行一些資源的彙總. 先來群里 大大提供的兩張圖,清晰易懂: Dockerized Java https://www.youtube.com/watch?v=NQ5hTEp GTM Java on Linux for devs and ops https://w ...
  • 題目:列印隊列 題目介紹:現在用印表機列印隊列,已知列印任務有9個優先順序(1-9),現在給出一系列任務,求輸出列印順序(任務下標,從0開始)。 例: 輸入:9,3,5,4,7,1 輸出:0,4,2,3,1,5 分析:第一點是不知道輸入任務的個數,這個要用 reserve 指令來解決;第二點是不要忽略 ...
  • 地址:https://github.com/jxlwqq/id validator.py 中華人民共和國居民身份證 、 中華人民共和國港澳居民居住證 以及 中華人民共和國臺灣居民居住證 號碼驗證工具(Python 版)支持 15 位與 18 位號碼。 "PHP 版本" 安裝 使用 和 示例大陸居民身 ...
  • 瞭解JSP 1、什麼是JSP? JSP全名為Java Servlet pages,中文名為web伺服器頁面,它是在傳統的網頁HTML文件(*.htm,*.html)中插入java程式段和JSP標記,尾碼名為(*.jsp),其根本是一個簡化的Servlet設計。 2、為什麼要有JSP? 直接使用HTM ...
  • 今天呢,我們來討論一下用C++實現DLL註入的簡單方法。 環境: Visual Studio 2015及以上 Windows 7及以上 入門需要瞭解的: DLL是什麼:DLL_360百科 DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。在Windows中,許多應用程式並不是一 ...
  • Django框架簡介 MVC框架和MTV框架 MVC,全名是Model View Controller,是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等優點。 Django框架的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...