springAOP完整實(shí)現(xiàn)過(guò)程
前言
江湖陽(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í)例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11JDK安裝與配置超級(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問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Spring 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,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08快速入門(mén)HarmonyOS的Java UI框架的教程
這篇文章主要介紹了快速入門(mén)HarmonyOS的Java UI框架,本文給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09