springAOP完整實現(xiàn)過程
前言
江湖陽哥曾經(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
- 數(shù)組和二維數(shù)組感覺用王者榮耀的裝備欄來舉例解釋,應該更易懂一些。從基礎開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)
這篇文章主要給大家介紹了關于JDK安裝與配置(包含二個或多個JDK的同時安裝)的相關資料,對于Java學習者來說,一臺電腦拿到手肯定要配置JDK,但是對于新手來說還是容易出錯,需要的朋友可以參考下2023-10-10利用Kafka動態(tài)調整topic分區(qū)partition
這篇文章主要介紹了利用Kafka動態(tài)調整topic分區(qū)partition問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12最新評論