8 個(gè)Spring AOP 全部注解:真實(shí)業(yè)務(wù)使用案例說明(必須收藏)

image.png

Spring AOP(面向切面編程)是Spring框架的一個(gè)重要組成部分,它允許開發(fā)者以聲明式的方式實(shí)現(xiàn)橫切關(guān)注點(diǎn),如日志記錄、事務(wù)管理、安全性控制等。通過使用Spring AOP注解,我們可以將這些橫切邏輯與業(yè)務(wù)邏輯分離,從而保持代碼的清晰和可維護(hù)性。AOP注解提供了一種強(qiáng)大的機(jī)制,使得開發(fā)者能夠在不修改主業(yè)務(wù)邏輯代碼的前提下,為應(yīng)用程序添加豐富的橫切功能,增強(qiáng)了代碼的模塊化和重用性。這些注解包括@Aspect、@Pointcut、@Before、@After、@AfterReturning、@AfterThrowing、@Around和@EnableAspectJAutoProxy等,它們共同構(gòu)成了Spring AOP的核心,使得開發(fā)者能夠輕松地實(shí)現(xiàn)復(fù)雜的企業(yè)級(jí)特性。

肖哥彈架構(gòu) 跟大家“彈彈” 代碼設(shè)計(jì)技巧,需要代碼關(guān)注

歷史熱點(diǎn)文章

1、AOP代理注解

1. @Aspect

1.1 注解作用介紹

@Aspect 注解用于標(biāo)識(shí)一個(gè)類作為切面類,允許在其中定義切點(diǎn)和通知。

1.2 注解屬性介紹

  • 無特定屬性。

1.3 注解業(yè)務(wù)案例

@Aspect
@Component
public class SecurityAspect {
    // 切點(diǎn)和通知定義
}

2. @Pointcut

2.1 注解作用介紹

@Pointcut 注解用于定義一個(gè)切點(diǎn),可以與@Before、@AfterReturning、@AfterThrowing等注解結(jié)合使用。

2.2 注解屬性介紹

  • value: 指定切點(diǎn)表達(dá)式。

2.3 注解業(yè)務(wù)案例

@Pointcut("execution(* com.example.service.*.*(..))")
public void pointcutServiceMethods() {
    // 切點(diǎn)表達(dá)式定義,匹配com.example.service包下的所有方法。
}

3. @Before

3.1 注解作用介紹

@Before 注解用于定義前置通知,它會(huì)在目標(biāo)方法執(zhí)行之前執(zhí)行。

3.2 注解屬性介紹

  • valuepointcut: 指定切點(diǎn)表達(dá)式。
    3.3 注解業(yè)務(wù)案例
@Before("pointcutServiceMethods()")
public void logBeforeServiceMethod(JoinPoint joinPoint) {
    // 日志記錄邏輯,例如記錄方法名和參數(shù)
    String methodName = joinPoint.getSignature().getName();
    Object[] args = joinPoint.getArgs();
    System.out.println("Entering: " + methodName + " with arguments " + Arrays.toString(args));
}

4. @After

4.1 注解作用介紹

@After 注解用于定義后置通知,它會(huì)在目標(biāo)方法執(zhí)行之后執(zhí)行。

4.2 注解屬性介紹

  • valuepointcut: 指定切點(diǎn)表達(dá)式。

4.3 注解業(yè)務(wù)案例

@After("pointcutServiceMethods()")
public void logAfterServiceMethod(JoinPoint joinPoint) {
    // 日志記錄邏輯,例如記錄方法執(zhí)行完成
    String methodName = joinPoint.getSignature().getName();
    System.out.println("Exiting: " + methodName);
}

5. @AfterReturning

5.1 注解作用介紹

@AfterReturning 注解用于定義返回后通知,它會(huì)在目標(biāo)方法成功執(zhí)行并返回結(jié)果之后執(zhí)行。

5.2 注解屬性介紹

  • valuepointcut: 指定切點(diǎn)表達(dá)式。
  • returning: 指定從目標(biāo)方法返回的參數(shù)名稱。
    5.3 注解業(yè)務(wù)案例
@AfterReturning(pointcut = "pointcutServiceMethods()", returning = "result")
public void logAfterReturningServiceMethod(Object result) {
    // 處理方法返回結(jié)果
    System.out.println("Service method returned: " + result);
}

6. @AfterThrowing

6.1 注解作用介紹

@AfterThrowing 注解用于定義異常拋出通知,它會(huì)在目標(biāo)方法拋出異常之后執(zhí)行。

6.2 注解屬性介紹

  • valuepointcut: 指定切點(diǎn)表達(dá)式。
  • throwing: 指定異常參數(shù)名稱。

6.3 注解業(yè)務(wù)案例

@AfterThrowing(pointcut = "pointcutServiceMethods()", throwing = "exception")
public void logAfterThrowingServiceMethod(Exception exception) {
    // 異常處理邏輯
    System.err.println("Service method threw exception: " + exception.getMessage());
}

7. @Around

7.1 注解作用介紹

@Around 注解用于定義環(huán)繞通知,它包圍目標(biāo)方法的執(zhí)行,允許在方法執(zhí)行前后和方法拋出異常時(shí)執(zhí)行自定義邏輯。
7.2 注解屬性介紹

  • valuepointcut: 指定切點(diǎn)表達(dá)式。
    7.3 注解業(yè)務(wù)案例
@Around("pointcutServiceMethods()")
public Object aroundServiceMethod(ProceedingJoinPoint joinPoint) throws Throwable {
    // 方法執(zhí)行前后的邏輯
    long startTime = System.currentTimeMillis();
    Object result = joinPoint.proceed(); // 繼續(xù)執(zhí)行目標(biāo)方法
    long endTime = System.currentTimeMillis();
    System.out.println("Execution time: " + (endTime - startTime) + " ms");
    return result;
}

8. @EnableAspectJAutoProxy

8.1 注解作用介紹

@EnableAspectJAutoProxy 注解用于開啟對(duì)AspectJ代理的支持,通常在配置類上使用。
8.2 注解屬性介紹

  • 無特定屬性。
    8.3 注解業(yè)務(wù)案例
@Configuration
@EnableAspectJAutoProxy
public class AspectConfiguration {
    // 其他Spring配置
}

2、AOP代理注解綜合案例

電子商務(wù)平臺(tái)的訂單服務(wù),其中包含訂單創(chuàng)建、訂單支付和訂單狀態(tài)查詢的方法。我們需要記錄每個(gè)訂單操作的日志、監(jiān)控操作的執(zhí)行時(shí)間,并處理可能發(fā)生的異常。

2.1 實(shí)體類:Order

public class Order {
    private Long id;
    private String status;
    // 其他訂單屬性和方法
}

2.2 服務(wù)接口:OrderService

public interface OrderService {
    void createOrder(Order order);
    void processPayment(Long orderId);
    Order getOrderStatus(Long orderId);
}

2.3 服務(wù)實(shí)現(xiàn):OrderServiceImpl

@Service
public class OrderServiceImpl implements OrderService {
    @Override
    public void createOrder(Order order) {
        // 創(chuàng)建訂單的業(yè)務(wù)邏輯
    }

    @Override
    public void processPayment(Long orderId) {
        // 處理訂單支付的業(yè)務(wù)邏輯
    }

    @Override
    public Order getOrderStatus(Long orderId) {
        // 獲取訂單狀態(tài)的業(yè)務(wù)邏輯
        return new Order(); // 返回新訂單狀態(tài)
    }
}

2.4 切面類:OrderAspect

@Aspect
@Component
public class OrderAspect {
    
    @Pointcut("execution(* com.example.ecommerce.service.OrderService.*(..))")
    public void orderServiceMethods() {}

    @Before("orderServiceMethods()")
    public void logBeforeOrderServiceMethod(JoinPoint joinPoint) {
        // 日志記錄邏輯,記錄方法入口
        String methodName = joinPoint.getSignature().getName();
        System.out.println("Before method: " + methodName);
    }

    @AfterReturning(pointcut = "orderServiceMethods()", returning = "result")
    public void logAfterReturningOrderServiceMethod(Object result) {
        // 處理方法返回結(jié)果
        System.out.println("After method returned: " + result);
    }

    @AfterThrowing(pointcut = "orderServiceMethods()", throwing = "error")
    public void logAfterThrowingOrderServiceMethod(Exception error) {
        // 異常處理邏輯
        System.err.println("Exception in order service: " + error.getMessage());
    }

    @Around("orderServiceMethods()")
    public Object aroundOrderServiceMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        // 方法執(zhí)行前后的邏輯
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed(); // 繼續(xù)執(zhí)行目標(biāo)方法
        long endTime = System.currentTimeMillis();
        System.out.println("Execution time: " + (endTime - startTime) + " ms");
        return result;
    }
}

2.5 配置類:AspectConfiguration

@Configuration
@EnableAspectJAutoProxy
public class AspectConfiguration {
    // 其他Spring配置
}

本案例中,我們定義了一個(gè)Order實(shí)體類、一個(gè)OrderService接口及其實(shí)現(xiàn)OrderServiceImpl。OrderAspect切面類使用@Aspect注解標(biāo)識(shí),其中定義了多個(gè)通知方法,使用@Pointcut定義了切點(diǎn)表達(dá)式,這些通知方法將應(yīng)用于OrderService中的所有方法。我們還使用@Before、@AfterReturning、@AfterThrowing@Around注解來定義前置通知、返回后通知、異常拋出通知和環(huán)繞通知。最后,AspectConfiguration配置類用于開啟AspectJ自動(dòng)代理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容