轉自:
http://www.java265.com/JavaFramework/Spring/202206/3612.html
下文筆者將通過示例的方式講述Spring注解(AOP)的簡介說明,如下所示:
package com.java265.aop;
public class MathCalculator {
public int div(int i, int j){
System.out.println("MathCalculator...div...");
return i / j;
}
}
切面類
package com.java265.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import java.util.Arrays;
//日志切面類
@Aspect
public class LogAspects {
//收取公共的切入點運算式 1.本類參考:直接寫方法名+()2.其他類參考:全名
@Pointcut("execution(public int com.java265.aop.MathCalculator.div(int, int))")
public void pointCut(){}
//@Before在目標方法前切入;切入點運算式(指定在哪個方法切入);JointPoint 一定要在引數第一位
@Before("pointCut()")
public void logStart(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
System.out.println(joinPoint.getSignature().getName() + "運行了...引數串列是:{" + Arrays.asList(args)+ "}");
}
@After("pointCut()")
public void logEnd(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName() + "結束了...");
}
@AfterReturning(value = "https://www.cnblogs.com/java265/archive/2022/06/21/pointCut()", returning = "result")
public void logReturn(JoinPoint joinPoint, Object result){
System.out.println(joinPoint.getSignature().getName() + "正常回傳...運行結果:{" + result + "}");
}
//外部類參考切入點運算式
@AfterThrowing(value = "https://www.cnblogs.com/java265/archive/2022/06/21/com.java265.aop.LogAspects.pointCut()", throwing = "e")
public void logException(JoinPoint joinPoint, Exception e){
System.out.println(joinPoint.getSignature().getName() + "例外...例外資訊:{" + e + "}");
}
}
配置類:
package com.java265.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import com.java265.aop.LogAspects;
import com.java265.aop.MathCalculator;
/**
* AOP:指在程式運行期間動態的將某段代碼切入到指定方法指定位置進行運行的編程方式;
*
* 1、 匯入aop模塊:Spring AOP
* 2、 定義一個業務邏輯類(MathCalculator);在業務邏輯運行的時候將日志進行列印(方法之前,方法運行結束、出現例外等)
* 3. 定義一個日志切面類(LogAspects):切面類里面的方法需要動態感知MathCalculator.div運行到哪里然后執行
* 通知方法:
* 前置通知(@Before):logStart:在目標方法div運行之間運行
* 后置通知(@After):logEnd:在目標方法div運行結束之后運行
* 回傳通知(@AfterReturning):logReturn:在目標方法div正常回傳之后運行
* 例外通知(@AfterThrowing):logException:在目標方法div出現例外以后運行
* 環繞通知(@Around):動態代理,手動推進目標方法運行(joinPoint.procced())
* 4. 給切面類的目標方法標注何時運行(通知注解)
* 5. 將切面類和業務邏輯類(目標方法所在類)都加入到IOC容器中
* 6. 必須告訴Spring哪個類是切面類(給切面類加一個注解@Aspect)
* 7. 給配置類中加@EnableAspectJAutoProxy開啟基于注解的aop模式
*/
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {
//業務邏輯類加入容器中
@Bean
public MathCalculator mathCalculator(){
return new MathCalculator();
}
//切面類加入到容器中
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
測驗:
@Test
public void test01(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
MathCalculator mathCalcullator = (MathCalculator) ac.getBean("mathCalculator");
mathCalcullator.div(1,1);
ac.close();
}
-----運行以上代碼,將輸出以下資訊-----
div運行了...引數串列是:{[1, 1]}
MathCalculator...div...
div結束了...
div正常回傳...運行結果:{1}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/494283.html
標籤:其他
上一篇:面試官竟然問我訂單ID是怎么生成的?難道不是MySQL自增主鍵?
下一篇:資料型別
