全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)常見(jiàn)問(wèn)題正文

在Spring AOP中,關(guān)注點(diǎn)和橫切關(guān)注有什么區(qū)別?

更新時(shí)間:2023-09-26 來(lái)源:黑馬程序員 瀏覽量:

  在Spring AOP(面向切面編程)中,關(guān)注點(diǎn)(Concern)和橫切關(guān)注(Cross-cutting Concern)是兩個(gè)重要的概念,它們有一定的區(qū)別。讓我們先來(lái)理解這兩個(gè)概念:

  1.關(guān)注點(diǎn)(Concern):

  (1)關(guān)注點(diǎn)是指在應(yīng)用程序中的某個(gè)特定功能或興趣區(qū)域內(nèi)的任務(wù)或功能。它可以是應(yīng)用程序的任何部分,負(fù)責(zé)完成特定的業(yè)務(wù)邏輯或功能。

  (2)關(guān)注點(diǎn)通常是應(yīng)用程序的不同模塊或組件的功能單元,它們需要被獨(dú)立地開(kāi)發(fā)、測(cè)試和維護(hù)。

  (3)例如,在一個(gè)電子商務(wù)應(yīng)用中,訂單處理、支付處理和用戶(hù)身份驗(yàn)證都可以被視為不同的關(guān)注點(diǎn)。

  2.橫切關(guān)注(Cross-cutting Concern):

  (1)橫切關(guān)注是與應(yīng)用程序的多個(gè)部分或模塊相關(guān)的關(guān)注點(diǎn),它們通常橫跨整個(gè)應(yīng)用程序。這些關(guān)注點(diǎn)不屬于單個(gè)模塊,而是與多個(gè)模塊交織在一起。

  (2)橫切關(guān)注通常包括日志記錄、安全性、事務(wù)管理等與業(yè)務(wù)邏輯無(wú)關(guān)但對(duì)整個(gè)應(yīng)用程序都很重要的方面。

  (3)例如,日志記錄是一個(gè)橫切關(guān)注,因?yàn)樾枰趹?yīng)用程序的多個(gè)地方記錄日志,而不僅僅是某個(gè)特定模塊。

  Spring AOP提供了一種有效的方式來(lái)處理橫切關(guān)注,通過(guò)將橫切關(guān)注從核心業(yè)務(wù)邏輯中分離出來(lái),可以提高代碼的可維護(hù)性和可重用性。

  接下來(lái)筆者詳細(xì)演示一下使用Spring AOP演示橫切關(guān)注和關(guān)注點(diǎn)的示例:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    // 定義切點(diǎn)表達(dá)式,匹配所有service包下的方法
    @Before("execution(* com.example.myapp.service.*.*(..))")
    public void logBeforeServiceMethods() {
        // 這里編寫(xiě)日志記錄的邏輯
        System.out.println("Before executing service method");
    }

    // 定義切點(diǎn)表達(dá)式,匹配所有controller包下的方法
    @Before("execution(* com.example.myapp.controller.*.*(..))")
    public void logBeforeControllerMethods() {
        // 這里編寫(xiě)日志記錄的邏輯
        System.out.println("Before executing controller method");
    }
}

  在上面的示例中,LoggingAspect類(lèi)是一個(gè)切面,它定義了兩個(gè)通知方法,分別匹配了應(yīng)用程序中的服務(wù)層和控制器層的方法。這兩個(gè)通知方法都執(zhí)行日志記錄操作,這是一個(gè)橫切關(guān)注,因?yàn)樗鼨M跨了應(yīng)用程序的不同部分(服務(wù)和控制器),而不是關(guān)注于單一模塊。

  然后,我們可以通過(guò)Spring配置將這個(gè)切面與應(yīng)用程序中的相關(guān)組件關(guān)聯(lián)起來(lái),以實(shí)現(xiàn)橫切關(guān)注的功能。

  本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!

  作者:黑馬程序員Java培訓(xùn)學(xué)院

  首發(fā):https://java.itheima.com

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!