springAOP完整實現(xiàn)過程
前言
江湖陽哥曾經(jīng)說過這么句話:
使用技術(shù)在當前這個環(huán)境中無非就是這么幾步:
1、引入POM(maven)坐標
2、改yml(配置文件也可以是properties等等)
3、寫配置類或者在啟動類上加注解
4、寫代碼就完事
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、熟悉相關(guān)概念:
在Spring AOP中,注解是
定義切面(Aspects)、切點(Pointcuts)、通知(Advice)等的主要方式。
以下是Spring AOP中幾種常見的注解及其用途和如何使用:
1、@Aspect:
- 作用:標識一個類為切面類。
- 使用方式:將此注解標注在類上,這個類會包含切點和通知的定義。
- 示例
示例:
@Aspect
public class MyAspect {
// 切點和通知定義...
}2、@Pointcut:
- 作用:定義一個切點,即橫切關(guān)注點的入口,明確什么樣的方法調(diào)用會被攔截。
- 使用方式:在方法聲明前使用此注解,并提供一個切點表達式,該方法本身通常是空方法,僅作為切點的引用。
- 示例:
@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,可能是目標方法的返回值,也可能是你自定義的返回值。你可以在此方法中直接調(diào)用目標方法。
- 示例:
@Aspect
public class MyAspect {
@Around("serviceMethod()")
public Object aroundServiceMethod(ProceedingJoinPoint pjp) throws Throwable {
// 前置邏輯...
Object result = pjp.proceed(); // 執(zhí)行目標方法
// 后置邏輯...
return result;
}
}Spring AOP的使用通常有兩種方式:
通過注解驅(qū)動的方式:在配置類上使用 @EnableAspectJAutoProxy 注解開啟AOP支持,然后聲明切面類和相關(guān)注解。
通過XML配置的方式:在XML文件中定義 aop:config 元素,并在該元素內(nèi)部配置切面和通知。
通常情況下,注解驅(qū)動的方式更簡潔直觀,且是推薦的做法。不過,在某些用例或舊項目中,XML配置方式可能還是會用到。
二、具體使用case:
當然,讓我們以一個簡單的AOP用例為例,實現(xiàn)一個記錄方法執(zhí)行時間的切面。首先確保您的項目已經(jīng)加入了Spring AOP的相關(guān)依賴,例如,使用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的配置類加入如下內(nèi)容,以啟用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();
}
}
}當你調(diào)用SimpleService類的doSomething方法時,上述的PerformanceAspect會自動攔截此調(diào)用,并且記錄該方法的執(zhí)行時間。這樣你就完成了一個針對Spring的AOP入門級案例。
總結(jié)
好了盡情的開發(fā)使用吧,其實這個是為了我寫那個面試題的文章準備的哈哈哈哈
到此這篇關(guān)于springAOP完整實現(xiàn)過程的文章就介紹到這了,更多相關(guān)springAOP實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java類如何實現(xiàn)一個類的障眼法(JadClipse的bug)
這篇文章主要介紹了Java類實現(xiàn)一個類的障眼法(JadClipse的bug),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
springboot整合spring-data-redis遇到的坑
使用springboot整合redis,使用默認的序列化配置,然后使用redis-client去查詢時查詢不到相應的key.問題出在哪,怎么解決呢?下面小編給大家?guī)砹藄pringboot整合spring-data-redis遇到的坑,需要的的朋友參考下吧2017-04-04
idea中service或者mapper引入報紅的問題及解決
在使用IntelliJ IDEA開發(fā)SpringBoot項目時,有時會遇到Service或Mapper接口引入時報紅但不影響項目運行的情況,這主要是因為IDEA的檢查級別設置問題,解決方法是將有問題的Error級別改為編譯通過的安全級別,即可消除報紅2024-09-09
Java實現(xiàn)JDBC連接數(shù)據(jù)庫簡單案例
這篇文章主要介紹了Java實現(xiàn)JDBC連接數(shù)據(jù)庫簡單案例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
Java實現(xiàn)Html轉(zhuǎn)Pdf的方法
這篇文章主要介紹了Java實現(xiàn)Html轉(zhuǎn)Pdf的方法,實例分析了java基于ITextRenderer類操作頁面及系統(tǒng)自帶字體生成pdf文件的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
Java語言實現(xiàn)簡單FTP軟件 FTP上傳下載隊列窗口實現(xiàn)(7)
這篇文章主要為大家詳細介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP上傳下載隊列窗口的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04

