Spring AOP(面向切面編程)是Spring框架的一個(gè)重要組成部分尊搬,它允許開發(fā)者以聲明式的方式實(shí)現(xiàn)橫切關(guān)注點(diǎn)湾蔓,如日志記錄椒丧、事務(wù)管理壹甥、安全性控制等。通過使用Spring AOP注解壶熏,我們可以將這些橫切邏輯與業(yè)務(wù)邏輯分離句柠,從而保持代碼的清晰和可維護(hù)性。AOP注解提供了一種強(qiáng)大的機(jī)制棒假,使得開發(fā)者能夠在不修改主業(yè)務(wù)邏輯代碼的前提下溯职,為應(yīng)用程序添加豐富的橫切功能,增強(qiáng)了代碼的模塊化和重用性帽哑。這些注解包括@Aspect谜酒、@Pointcut、@Before妻枕、@After僻族、@AfterReturning粘驰、@AfterThrowing、@Around和@EnableAspectJAutoProxy等述么,它們共同構(gòu)成了Spring AOP的核心蝌数,使得開發(fā)者能夠輕松地實(shí)現(xiàn)復(fù)雜的企業(yè)級(jí)特性。
肖哥彈架構(gòu) 跟大家“彈彈” 代碼設(shè)計(jì)技巧度秘,需要代碼關(guān)注
歷史熱點(diǎn)文章
- 28個(gè)驗(yàn)證注解顶伞,通過業(yè)務(wù)案例讓你精通Java數(shù)據(jù)校驗(yàn)(收藏篇)
- Java 8函數(shù)式編程全攻略:43種函數(shù)式業(yè)務(wù)代碼實(shí)戰(zhàn)案例解析(收藏版)
- 69 個(gè)Spring mvc 全部注解:真實(shí)業(yè)務(wù)使用案例說明(必須收藏)
- 24 個(gè)Spring bean 全部注解:真實(shí)業(yè)務(wù)使用案例說明(必須收藏)
- MySQL索引完全手冊(cè):真實(shí)業(yè)務(wù)圖文講解17種索引運(yùn)用技巧(必須收藏)
- 一個(gè)項(xiàng)目代碼講清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
1、AOP代理注解
1. @Aspect
1.1 注解作用介紹
@Aspect
注解用于標(biāo)識(shí)一個(gè)類作為切面類敷钾,允許在其中定義切點(diǎn)和通知枝哄。
1.2 注解屬性介紹
- 無特定屬性。
1.3 注解業(yè)務(wù)案例
@Aspect
@Component
public class SecurityAspect {
// 切點(diǎn)和通知定義
}
2. @Pointcut
2.1 注解作用介紹
@Pointcut
注解用于定義一個(gè)切點(diǎn)阻荒,可以與@Before挠锥、@AfterReturning、@AfterThrowing等注解結(jié)合使用侨赡。
2.2 注解屬性介紹
- value: 指定切點(diǎn)表達(dá)式蓖租。
2.3 注解業(yè)務(wù)案例
@Pointcut("execution(* com.example.service.*.*(..))")
public void pointcutServiceMethods() {
// 切點(diǎn)表達(dá)式定義,匹配com.example.service包下的所有方法羊壹。
}
3. @Before
3.1 注解作用介紹
@Before
注解用于定義前置通知蓖宦,它會(huì)在目標(biāo)方法執(zhí)行之前執(zhí)行。
3.2 注解屬性介紹
-
value 或 pointcut: 指定切點(diǎn)表達(dá)式油猫。
3.3 注解業(yè)務(wù)案例
@Before("pointcutServiceMethods()")
public void logBeforeServiceMethod(JoinPoint joinPoint) {
// 日志記錄邏輯稠茂,例如記錄方法名和參數(shù)
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println("Entering: " + methodName + " with arguments " + Arrays.toString(args));
}
4. @After
4.1 注解作用介紹
@After
注解用于定義后置通知,它會(huì)在目標(biāo)方法執(zhí)行之后執(zhí)行情妖。
4.2 注解屬性介紹
- value 或 pointcut: 指定切點(diǎn)表達(dá)式睬关。
4.3 注解業(yè)務(wù)案例
@After("pointcutServiceMethods()")
public void logAfterServiceMethod(JoinPoint joinPoint) {
// 日志記錄邏輯,例如記錄方法執(zhí)行完成
String methodName = joinPoint.getSignature().getName();
System.out.println("Exiting: " + methodName);
}
5. @AfterReturning
5.1 注解作用介紹
@AfterReturning
注解用于定義返回后通知毡证,它會(huì)在目標(biāo)方法成功執(zhí)行并返回結(jié)果之后執(zhí)行电爹。
5.2 注解屬性介紹
- value 或 pointcut: 指定切點(diǎn)表達(dá)式。
-
returning: 指定從目標(biāo)方法返回的參數(shù)名稱料睛。
5.3 注解業(yè)務(wù)案例
@AfterReturning(pointcut = "pointcutServiceMethods()", returning = "result")
public void logAfterReturningServiceMethod(Object result) {
// 處理方法返回結(jié)果
System.out.println("Service method returned: " + result);
}
6. @AfterThrowing
6.1 注解作用介紹
@AfterThrowing
注解用于定義異常拋出通知丐箩,它會(huì)在目標(biāo)方法拋出異常之后執(zhí)行。
6.2 注解屬性介紹
- value 或 pointcut: 指定切點(diǎn)表達(dá)式恤煞。
- throwing: 指定異常參數(shù)名稱屎勘。
6.3 注解業(yè)務(wù)案例
@AfterThrowing(pointcut = "pointcutServiceMethods()", throwing = "exception")
public void logAfterThrowingServiceMethod(Exception exception) {
// 異常處理邏輯
System.err.println("Service method threw exception: " + exception.getMessage());
}
7. @Around
7.1 注解作用介紹
@Around
注解用于定義環(huán)繞通知,它包圍目標(biāo)方法的執(zhí)行居扒,允許在方法執(zhí)行前后和方法拋出異常時(shí)執(zhí)行自定義邏輯概漱。
7.2 注解屬性介紹
-
value 或 pointcut: 指定切點(diǎn)表達(dá)式。
7.3 注解業(yè)務(wù)案例
@Around("pointcutServiceMethods()")
public Object aroundServiceMethod(ProceedingJoinPoint joinPoint) throws Throwable {
// 方法執(zhí)行前后的邏輯
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed(); // 繼續(xù)執(zhí)行目標(biāo)方法
long endTime = System.currentTimeMillis();
System.out.println("Execution time: " + (endTime - startTime) + " ms");
return result;
}
8. @EnableAspectJAutoProxy
8.1 注解作用介紹
@EnableAspectJAutoProxy
注解用于開啟對(duì)AspectJ代理的支持苔货,通常在配置類上使用犀概。
8.2 注解屬性介紹
- 無特定屬性立哑。
8.3 注解業(yè)務(wù)案例
@Configuration
@EnableAspectJAutoProxy
public class AspectConfiguration {
// 其他Spring配置
}
2、AOP代理注解綜合案例
電子商務(wù)平臺(tái)的訂單服務(wù)姻灶,其中包含訂單創(chuàng)建铛绰、訂單支付和訂單狀態(tài)查詢的方法。我們需要記錄每個(gè)訂單操作的日志产喉、監(jiān)控操作的執(zhí)行時(shí)間捂掰,并處理可能發(fā)生的異常。
2.1 實(shí)體類:Order
public class Order {
private Long id;
private String status;
// 其他訂單屬性和方法
}
2.2 服務(wù)接口:OrderService
public interface OrderService {
void createOrder(Order order);
void processPayment(Long orderId);
Order getOrderStatus(Long orderId);
}
2.3 服務(wù)實(shí)現(xiàn):OrderServiceImpl
@Service
public class OrderServiceImpl implements OrderService {
@Override
public void createOrder(Order order) {
// 創(chuàng)建訂單的業(yè)務(wù)邏輯
}
@Override
public void processPayment(Long orderId) {
// 處理訂單支付的業(yè)務(wù)邏輯
}
@Override
public Order getOrderStatus(Long orderId) {
// 獲取訂單狀態(tài)的業(yè)務(wù)邏輯
return new Order(); // 返回新訂單狀態(tài)
}
}
2.4 切面類:OrderAspect
@Aspect
@Component
public class OrderAspect {
@Pointcut("execution(* com.example.ecommerce.service.OrderService.*(..))")
public void orderServiceMethods() {}
@Before("orderServiceMethods()")
public void logBeforeOrderServiceMethod(JoinPoint joinPoint) {
// 日志記錄邏輯曾沈,記錄方法入口
String methodName = joinPoint.getSignature().getName();
System.out.println("Before method: " + methodName);
}
@AfterReturning(pointcut = "orderServiceMethods()", returning = "result")
public void logAfterReturningOrderServiceMethod(Object result) {
// 處理方法返回結(jié)果
System.out.println("After method returned: " + result);
}
@AfterThrowing(pointcut = "orderServiceMethods()", throwing = "error")
public void logAfterThrowingOrderServiceMethod(Exception error) {
// 異常處理邏輯
System.err.println("Exception in order service: " + error.getMessage());
}
@Around("orderServiceMethods()")
public Object aroundOrderServiceMethod(ProceedingJoinPoint joinPoint) throws Throwable {
// 方法執(zhí)行前后的邏輯
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed(); // 繼續(xù)執(zhí)行目標(biāo)方法
long endTime = System.currentTimeMillis();
System.out.println("Execution time: " + (endTime - startTime) + " ms");
return result;
}
}
2.5 配置類:AspectConfiguration
@Configuration
@EnableAspectJAutoProxy
public class AspectConfiguration {
// 其他Spring配置
}
本案例中这嚣,我們定義了一個(gè)Order
實(shí)體類、一個(gè)OrderService
接口及其實(shí)現(xiàn)OrderServiceImpl
塞俱。OrderAspect
切面類使用@Aspect
注解標(biāo)識(shí)姐帚,其中定義了多個(gè)通知方法,使用@Pointcut
定義了切點(diǎn)表達(dá)式障涯,這些通知方法將應(yīng)用于OrderService
中的所有方法罐旗。我們還使用@Before
、@AfterReturning
唯蝶、@AfterThrowing
和@Around
注解來定義前置通知九秀、返回后通知、異常拋出通知和環(huán)繞通知粘我。最后鼓蜒,AspectConfiguration
配置類用于開啟AspectJ自動(dòng)代理。