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

springAOP完整實(shí)現(xiàn)過(guò)程

 更新時(shí)間:2024年02月28日 10:50:41   作者:蘇汀star  
當(dāng)你調(diào)用SimpleService類(lèi)的doSomething方法時(shí),上述的PerformanceAspect會(huì)自動(dòng)攔截此調(diào)用,并且記錄該方法的執(zhí)行時(shí)間,這樣你就完成了一個(gè)針對(duì)Spring的AOP入門(mén)級(jí)案例,感興趣的朋友一起看看吧

前言

江湖陽(yáng)哥曾經(jīng)說(shuō)過(guò)這么句話:
使用技術(shù)在當(dāng)前這個(gè)環(huán)境中無(wú)非就是這么幾步:
1、引入POM(maven)坐標(biāo)
2、改yml(配置文件也可以是properties等等)
3、寫(xiě)配置類(lèi)或者在啟動(dòng)類(lèi)上加注解
4、寫(xiě)代碼就完事

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

一、熟悉相關(guān)概念:

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

1、@Aspect:

  • 作用:標(biāo)識(shí)一個(gè)類(lèi)為切面類(lèi)。
  • 使用方式:將此注解標(biāo)注在類(lèi)上,這個(gè)類(lèi)會(huì)包含切點(diǎn)和通知的定義。
  • 示例

示例:

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

2、@Pointcut:

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

3、@Before:

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

示例:

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

4、@AfterReturning:

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

5、@AfterThrowing:

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

6、@After:

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

示例:

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

7、@Around:

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

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

通過(guò)注解驅(qū)動(dòng)的方式:在配置類(lèi)上使用 @EnableAspectJAutoProxy 注解開(kāi)啟AOP支持,然后聲明切面類(lèi)和相關(guān)注解。

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

通常情況下,注解驅(qū)動(dòng)的方式更簡(jiǎn)潔直觀,且是推薦的做法。不過(guò),在某些用例或舊項(xiàng)目中,XML配置方式可能還是會(huì)用到。

二、具體使用case:

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

1.pom文件

<!-- Spring AOP 依賴(lài) -->
<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)建一個(gè)切面,該切面會(huì)記錄方法執(zhí)行的時(shí)間:

// 具有@Aspect注解的類(lèi)會(huì)被Spring識(shí)別為一個(gè)切面
@Aspect
// 確保這個(gè)類(lèi)被Spring的容器掃描到,通常它應(yīng)該位于@ComponentScan指定的包或子包中
@Component
public class PerformanceAspect {
    // 切點(diǎn)表達(dá)式,這里是指任意返回值的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(); // 開(kāi)始時(shí)間
        Object output = pjp.proceed(); // 執(zhí)行被代理的方法
        long elapsedTime = System.currentTimeMillis() - start; // 計(jì)算消耗的時(shí)間
        System.out.println("Method execution time: " + elapsedTime + " milliseconds.");
        return output; // 返回被代理方法的返回值
    }
}

然后,你需要在Spring的配置類(lèi)加入如下內(nèi)容,以啟用AOP的自動(dòng)代理功能:

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

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

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

當(dāng)你調(diào)用SimpleService類(lèi)的doSomething方法時(shí),上述的PerformanceAspect會(huì)自動(dòng)攔截此調(diào)用,并且記錄該方法的執(zhí)行時(shí)間。這樣你就完成了一個(gè)針對(duì)Spring的AOP入門(mén)級(jí)案例。

總結(jié)

好了盡情的開(kāi)發(fā)使用吧,其實(shí)這個(gè)是為了我寫(xiě)那個(gè)面試題的文章準(zhǔn)備的哈哈哈哈

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

相關(guān)文章

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

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

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

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

    數(shù)組和二維數(shù)組感覺(jué)用王者榮耀的裝備欄來(lái)舉例解釋?zhuān)瑧?yīng)該更易懂一些。從基礎(chǔ)開(kāi)始講,后續(xù)會(huì)講到JAVA高級(jí),中間會(huì)穿插面試題和項(xiàng)目實(shí)戰(zhàn),希望能給大家?guī)?lái)幫助
    2022-03-03
  • RocketMQ中的NameServer詳細(xì)解析

    RocketMQ中的NameServer詳細(xì)解析

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

    JDK安裝與配置超級(jí)詳細(xì)教程(包含二個(gè)或多個(gè)JDK的同時(shí)安裝)

    這篇文章主要給大家介紹了關(guān)于JDK安裝與配置(包含二個(gè)或多個(gè)JDK的同時(shí)安裝)的相關(guān)資料,對(duì)于Java學(xué)習(xí)者來(lái)說(shuō),一臺(tái)電腦拿到手肯定要配置JDK,但是對(duì)于新手來(lái)說(shuō)還是容易出錯(cuò),需要的朋友可以參考下
    2023-10-10
  • 利用Kafka動(dòng)態(tài)調(diào)整topic分區(qū)partition

    利用Kafka動(dòng)態(tài)調(diào)整topic分區(qū)partition

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

    Spring Boot對(duì)Future模式的支持詳解

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

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

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

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

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

    Java多線程ForkJoinPool實(shí)例詳解

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

    快速入門(mén)HarmonyOS的Java UI框架的教程

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

最新評(píng)論