欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springAOP完整實現(xiàn)過程

 更新時間:2024年02月28日 10:50:41   作者:蘇汀star  
當你調用SimpleService類的doSomething方法時,上述的PerformanceAspect會自動攔截此調用,并且記錄該方法的執(zhí)行時間,這樣你就完成了一個針對Spring的AOP入門級案例,感興趣的朋友一起看看吧

前言

江湖陽哥曾經(jīng)說過這么句話:
使用技術在當前這個環(huán)境中無非就是這么幾步:
1、引入POM(maven)坐標
2、改yml(配置文件也可以是properties等等)
3、寫配置類或者在啟動類上加注解
4、寫代碼就完事

提示:以下是本篇文章正文內容,下面案例可供參考

一、熟悉相關概念:

在Spring AOP中,注解是
定義切面(Aspects)、切點(Pointcuts)、通知(Advice)等的主要方式。
以下是Spring AOP中幾種常見的注解及其用途和如何使用:

1、@Aspect:

  • 作用:標識一個類為切面類。
  • 使用方式:將此注解標注在類上,這個類會包含切點和通知的定義。
  • 示例

示例:

@Aspect
public class MyAspect {
    // 切點和通知定義...
}

2、@Pointcut:

  • 作用:定義一個切點,即橫切關注點的入口,明確什么樣的方法調用會被攔截。
  • 使用方式:在方法聲明前使用此注解,并提供一個切點表達式,該方法本身通常是空方法,僅作為切點的引用。
  • 示例:
@Aspect
public class MyAspect {
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethod() {}
    // 其他通知...
}

3、@Before:

  • 作用:定義一個前置通知,在切點的方法執(zhí)行之前執(zhí)行。
  • 使用方式:將此注解放在一個方法上,該方法將在目標方法執(zhí)行前執(zhí)行。
  • 示例:

示例:

@Aspect
public class MyAspect {
    @Before("serviceMethod()")
    public void beforeServiceMethod() {
        // 前置邏輯...
    }
}

4、@AfterReturning:

  • 作用:定義一個返回后通知,如果切點的方法正常返回后執(zhí)行。
  • 使用方式:將此注解放在一個方法上,并通過該方法提供的參數(shù)記入返回的值。
  • 示例:
@Aspect
public class MyAspect {
    @AfterReturning(pointcut = "serviceMethod()", returning = "retVal")
    public void afterReturning(Object retVal) {
        // 處理返回值...
    }
}

5、@AfterThrowing:

  • 作用:定義一個異常通知,如果切點的方法拋出異常后執(zhí)行。
  • 使用方式:將此注解放在一個方法上,并可選地獲取拋出的異常。
  • 示例:
@Aspect
public class MyAspect {
    @AfterThrowing(pointcut = "serviceMethod()", throwing = "ex")
    public void afterThrowing(Exception ex) {
        // 異常處理...
    }
}

6、@After:

  • 作用:定義一個最終通知,無論切點的方法是正常返回還是拋出異常都會執(zhí)行。
  • 使用方式:將此注解放在一個方法上,該方法無論目標方法如何都會執(zhí)行。
  • 示例:

示例:

@Aspect
public class MyAspect {
    @After("serviceMethod()")
    public void afterServiceMethod() {
        // 最終邏輯...
    }
}

7、@Around:

  • 作用:定義一個環(huán)繞通知,可以自定義在目標方法前后執(zhí)行的邏輯,同時決定是否繼續(xù)執(zhí)行目標方法。
  • 使用方式:將此注解放在一個方法上,該方法需要返回一個Object,可能是目標方法的返回值,也可能是你自定義的返回值。你可以在此方法中直接調用目標方法。
  • 示例:
@Aspect
public class MyAspect {
    @Around("serviceMethod()")
    public Object aroundServiceMethod(ProceedingJoinPoint pjp) throws Throwable {
        // 前置邏輯...
        Object result = pjp.proceed(); // 執(zhí)行目標方法
        // 后置邏輯...
        return result;
    }
}

Spring AOP的使用通常有兩種方式:

通過注解驅動的方式:在配置類上使用 @EnableAspectJAutoProxy 注解開啟AOP支持,然后聲明切面類和相關注解。

通過XML配置的方式:在XML文件中定義 aop:config 元素,并在該元素內部配置切面和通知。

通常情況下,注解驅動的方式更簡潔直觀,且是推薦的做法。不過,在某些用例或舊項目中,XML配置方式可能還是會用到。

二、具體使用case:

當然,讓我們以一個簡單的AOP用例為例,實現(xiàn)一個記錄方法執(zhí)行時間的切面。首先確保您的項目已經(jīng)加入了Spring AOP的相關依賴,例如,使用Maven時,您可以添加下列依賴到您的pom.xml文件:

1.pom文件

<!-- Spring AOP 依賴 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.3.18</version>
</dependency>
<!-- AOP聯(lián)盟API -->
<dependency>
    <groupId>aopalliance</groupId>
    <artifactId>aopalliance</artifactId>
    <version>1.0</version>
</dependency>
<!-- Spring框架的一部分,用于處理AOP的代理 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.3.18</version>
</dependency>

2.代碼

現(xiàn)在,讓我們創(chuàng)建一個切面,該切面會記錄方法執(zhí)行的時間:

// 具有@Aspect注解的類會被Spring識別為一個切面
@Aspect
// 確保這個類被Spring的容器掃描到,通常它應該位于@ComponentScan指定的包或子包中
@Component
public class PerformanceAspect {
    // 切點表達式,這里是指任意返回值的Service層中的任意方法
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethod() {}
    // 環(huán)繞通知,讓我們可以在方法執(zhí)行前后添加自定義邏輯
    @Around("serviceMethod()")
    public Object profile(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis(); // 開始時間
        Object output = pjp.proceed(); // 執(zhí)行被代理的方法
        long elapsedTime = System.currentTimeMillis() - start; // 計算消耗的時間
        System.out.println("Method execution time: " + elapsedTime + " milliseconds.");
        return output; // 返回被代理方法的返回值
    }
}

然后,你需要在Spring的配置類加入如下內容,以啟用AOP的自動代理功能:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.example") // 修改為你的包名
public class AppConfig {
    // 可以添加額外的Bean配置...
}

現(xiàn)在,你的AOP切面已經(jīng)準備好了。當你的程序運行時,任何匹配Pointcut(位于com.example.service包的任意方法)的方法都會被PerformanceAspect所攔截,它會在方法執(zhí)行前后記錄執(zhí)行時間,并將該時間打印到控制臺。
假設我們有一個簡單的服務類:

package com.example.service;
import org.springframework.stereotype.Service;
@Service
public class SimpleService {
    public void doSomething() {
        // 模擬業(yè)務邏輯處理時間
        try {
            Thread.sleep(1000); 
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

當你調用SimpleService類的doSomething方法時,上述的PerformanceAspect會自動攔截此調用,并且記錄該方法的執(zhí)行時間。這樣你就完成了一個針對Spring的AOP入門級案例。

總結

好了盡情的開發(fā)使用吧,其實這個是為了我寫那個面試題的文章準備的哈哈哈哈

到此這篇關于springAOP完整實現(xiàn)過程的文章就介紹到這了,更多相關springAOP實現(xiàn)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java編程實現(xiàn)springMVC簡單登錄實例

    Java編程實現(xiàn)springMVC簡單登錄實例

    這篇文章主要介紹了Java編程實現(xiàn)springMVC簡單登錄實例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java?在游戲中探索數(shù)組二維數(shù)組

    Java?在游戲中探索數(shù)組二維數(shù)組

    數(shù)組和二維數(shù)組感覺用王者榮耀的裝備欄來舉例解釋,應該更易懂一些。從基礎開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
  • RocketMQ中的NameServer詳細解析

    RocketMQ中的NameServer詳細解析

    這篇文章主要介紹了RocketMQ中的NameServer詳細解析,NameServer是一個非常簡單的Topic路由注冊中心,支持Broker的動態(tài)注冊與發(fā)現(xiàn),因此不能保證NameServer的一致性,需要的朋友可以參考下
    2024-01-01
  • JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)

    JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)

    這篇文章主要給大家介紹了關于JDK安裝與配置(包含二個或多個JDK的同時安裝)的相關資料,對于Java學習者來說,一臺電腦拿到手肯定要配置JDK,但是對于新手來說還是容易出錯,需要的朋友可以參考下
    2023-10-10
  • 利用Kafka動態(tài)調整topic分區(qū)partition

    利用Kafka動態(tài)調整topic分區(qū)partition

    這篇文章主要介紹了利用Kafka動態(tài)調整topic分區(qū)partition問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Spring Boot對Future模式的支持詳解

    Spring Boot對Future模式的支持詳解

    這篇文章主要給大家介紹了關于Spring Boot對Future模式的支持的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2019-01-01
  • 詳解spring項目中如何動態(tài)刷新bean

    詳解spring項目中如何動態(tài)刷新bean

    這篇文章主要為大家介紹了詳解spring項目中如何動態(tài)刷新bean,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java檢查日期字符串是否合法的方法總結

    Java檢查日期字符串是否合法的方法總結

    后端接口在接收數(shù)據(jù)的時候,都需要進行檢查。檢查全部通過后,才能夠執(zhí)行業(yè)務邏輯。本文總結了四個Java檢查日期字符串是否合法的方法,感興趣的可以了解一下
    2022-10-10
  • Java多線程ForkJoinPool實例詳解

    Java多線程ForkJoinPool實例詳解

    這篇文章主要介紹了Java多線程ForkJoinPool實例詳解,涉及forkjoin框架的相關內容,需要的朋友可以參考下。
    2017-09-09
  • 快速入門HarmonyOS的Java UI框架的教程

    快速入門HarmonyOS的Java UI框架的教程

    這篇文章主要介紹了快速入門HarmonyOS的Java UI框架,本文給大家介紹的非常詳細對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論