更新時間:2022-08-09 10:52:27 來源:動力節點 瀏覽772次
AOP配置,@EnableAspectJAutoProxy,@Before,@After,@AfterReturning,@AfterThrowing
指在程序運行期間動態的將某段代碼切入到指定方法指定位置進行運行的編程方式;
1.導入aop模塊;Spring AOP:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.定義一個業務邏輯類(CalculateController);在業務邏輯運行的時候將日志進行打印(方法之前、方法運行結束、方法出現異常,xxx)
3.定義一個日志切面類(LogAop):切面類里面的方法需要動態感知CalculateController.calculateNum運行到哪里然后執行;
通知方法:
前置通知(@Before):logStart:在目標方法(calculateNum)運行之前運行
后置通知(@After):logEnd:在目標方法(calculateNum)運行結束之后運行(無論方法正常結束還是異常結束)
返回通知(@AfterReturning):logReturn:在目標方法(calculateNum)正常返回之后運行
異常通知(@AfterThrowing):logException:在目標方法(calculateNum)出現異常以后運行
環繞通知(@Around):動態代理,手動推進目標方法運行(joinPoint.procced())
4.給切面類的目標方法標注何時何地運行(通知注解);
5.將切面類和業務邏輯類(目標方法所在類)都加入到容器中;
6.必須告訴Spring哪個類是切面類(給切面類上加一個注解:@Aspect)
7.給配置類中加 @EnableAspectJAutoProxy 【開啟基于注解的aop模式】
在Spring中很多的 @EnableXXX;
三步:
1)將業務邏輯組件和切面類都加入到容器中;告訴Spring哪個是切面類(@Aspect)
2)在切面類上的每一個通知方法上標注通知注解,告訴Spring何時何地運行(切入點表達式)
3)開啟基于注解的aop模式;@EnableAspectJAutoProxy
// @EnableAspectJAutoProxy 開啟基于注解的aop模式
@EnableAspectJAutoProxy
@Configuration
public class MyAopConfig {
@Bean
public CalculateController calculateController(){
return new CalculateController();
}
@Bean
public LogAop logAop(){
return new LogAop();
}
}
/**
* 切面類
*/
// @Aspect: 告訴Spring當前類是一個切面類
@Aspect
public class LogAop {
//抽取公共的切入點表達式
//1、本類引用
//2、其他的切面引用
@Pointcut("execution(public int com.example.studywork.work.controller.CalculateController.*(..))")
public void pointCut(){};
@Before(value ="pointCut()")
public void logStart(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName()+"方法運行前。。。參數列表是:{"+ Arrays.asList(joinPoint.getArgs())+"}");
}
// 外部切面類引用可以用全類名
@After("com.example.studywork.work.aop.LogAop.pointCut()")
public void logEnd(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName()+"方法結束。。。");
}
//JoinPoint一定要出現在參數表的第一位
@AfterReturning(value = "pointCut()",returning = "obj")
public void logReturn(JoinPoint joinPoint,Object obj){
System.out.println(joinPoint.getSignature().getName()+"方法正常返回。。。運行結果是:{"+obj+"}");
}
@AfterThrowing(value = "pointCut()",throwing = "e")
public void logxception(JoinPoint joinPoint,Exception e){
System.out.println(joinPoint.getSignature().getName()+"方法異常返回。。。異常結果是:{"+e+"}");
}
}
// 業務
public class CalculateController {
public int calculateNum(int i, int j){
System.out.println("CalculateController類的calculateNum方法正在運行");
return i/j;
}
}
輸出
@Test
public void test() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyAopConfig.class);
CalculateController bean = applicationContext.getBean(CalculateController.class);
bean.calculateNum(1,1);
}
輸出結果
異常輸出
@Test
public void test() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyAopConfig.class);
CalculateController bean = applicationContext.getBean(CalculateController.class);
bean.calculateNum(1,0);
}
輸出結果
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習