1.springboot中使用註解很容易開啓一個aop
@Aspect @Order(1) @Component
@Aspect:開啓aop,@Component:需要被掃描到,啓用這個類,@Order:啓動的aop有好多個,這個可以協調配置它們的先後順序
2.涉及到六個常用註解
@Pointcut("")
定義切入點:定義一個方法,代替需要做切面的方法。
比如現在想aop在A方法周圍環繞B,C,怎麼代替這個A方法呢?使用切入點代替,切入點就是這個切面方法。
有了這個方法後,就可以做aop了,那aop有順序在執行方法之前,執行方法的時候,執行方法之後,正常執行完畢,有異常執行完畢
對應的註解五個,名字也比較好理解
@Before,@Around,@After,@AfterReturning,@AfterThrowing
這個幾個註解的value都是寫@Pointcut("")定義方法的包路徑。來對這個切入點進行切面做aop。
注意問題:@Around這個呢,可以代替@Before和@After
3.使用順序
我只簡單列出所有註解,看執行過程順序時這樣的:
@Around--》@Before--》@After--》@AfterReturning--》@AfterThrowing
(1)@Around中調用了return 的 ProceedingJoinPoint.proceed(),這個調用幾次,方法會執行幾次
@Around(value = "com.fast.framework.aop.pointcut.SystemArchitecture.logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
logger.info("around");
return point.proceed();
}
查看測試日誌
15:37:54.865 INFO com.fast.framework.aop.LogAop 60 around - around
15:37:54.866 INFO com.fast.framework.aop.LogAop 44 before - before
執行切面方法
815:37:55.034 INFO com.fast.framework.aop.LogAop 66 after - after
15:37:55.034 INFO com.fast.framework.aop.LogAop 71 afterReturning - afterReturning
15:37:55.035 INFO com.fast.framework.aop.LogAop 76 afterThrowing - afterThrowing
順序:@Around--》@Before--》執行切面方法--》@After--》@AfterReturning--》@AfterThrowing
(2)在@Around方法過程中調用
@Around(value = "com.fast.framework.aop.pointcut.SystemArchitecture.logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
logger.info("around start");
Object proceed = point.proceed();
logger.info("around end");
return proceed;
}
輸出日誌
18:40:52.260 INFO com.fast.framework.aop.LogAop 60 around - around start
18:40:52.261 INFO com.fast.framework.aop.LogAop 44 before - before
執行切面方法
818:40:52.413 INFO com.fast.framework.aop.LogAop 62 around - around end
18:40:52.414 INFO com.fast.framework.aop.LogAop 68 after - after
18:40:52.415 INFO com.fast.framework.aop.LogAop 73 afterReturning - afterReturning
18:40:52.415 INFO com.fast.framework.aop.LogAop 78 afterThrowing - afterThrowing
順序:@Around 開始--》@Before--》執行切面方法--》@Around 結束--》@After--》@AfterReturning--》@AfterThrowing
看出around開始是在before之前,結束在before之後。
4.獲取織入方法的信息
1.JoinPoint
2.ProceedingJoinPoint
3.LocalVariableTableParameterNameDiscoverer 獲取方法參數名:詳情見:https://blog.csdn.net/Mint6/article/details/94991183
JoinPoint和ProceedingJoinPoint是差不多的,部分使用方法見:https://blog.csdn.net/Mint6/article/details/92121845
5.aop整體步驟
使用1234,都是指上面的那些步驟
使用1開啓aop--》使用2定義切入點@Pointcut(""),五個順序註解寫整體aop過程--》使用4獲取切面方法信息,進行切面。
附:@Around方法是需要手動給返回值,返回ProceedingJoinPoint.proceed()或者ProceedingJoinPoint.proceed()的執行結果都行,但是必須返回,不然aop默認攔截這個方法,沒有返回值。