關於AOP的一切,我與面試官的那一夜,難忘

前言

關於AOP的一切,我與面試官的那一夜,難忘

Aop 是一個高頻出現的技術點,不管在你的日常開發中還是在跳槽面試中,始終會看到它的影子。如此的高頻,證明了它的重要性,既然這麼重要,就沒有理由不去搞清楚它。

在弄清楚 Aop 之前先來看看非同步

@Async 和事務

@Transactional

的相關實現。

@Async實現

@Async

在這篇文章 你必須懂也可以懂的

@Async

原理 中做過詳細介紹,主要用來在應用實現非同步功能。

@EnableAsync開啟非同步功能

若要在應用中使用

@Async

來實現非同步功能,需要使用

@EnableAsync

註解來開啟非同步功能

注入ProxyAsyncConfiguration

@EnableAsync

註解引入了非同步配置選擇器

AsyncConfigurationSelectorbing

並向IOC容器中注入了

ProxyAsyncConfiguration

建立非同步註解處理器AsyncAnnotationBeanPostProcessor

ProxyAsyncConfiguration

中建立

AsyncAnnotationBeanPostProcessorBean處理器

建立切面

關於AOP的一切,我與面試官的那一夜,難忘

建立切點

關於AOP的一切,我與面試官的那一夜,難忘

建立通知

關於AOP的一切,我與面試官的那一夜,難忘

Bean後置處理

關於AOP的一切,我與面試官的那一夜,難忘

@Transactional實現

@EnableAsync開啟非同步功能

關於AOP的一切,我與面試官的那一夜,難忘

注入ProxyTransactionManagementConfiguration配置類

建立切面

關於AOP的一切,我與面試官的那一夜,難忘

建立切點

關於AOP的一切,我與面試官的那一夜,難忘

建立通知

關於AOP的一切,我與面試官的那一夜,難忘

注入InfrastructureAdvisorAutoProxyCreator

InfrastructureAdvisorAutoProxyCreator

實現了

BeanPostProcessor

介面,因此會攔截所有的Bean進行處理

關於AOP的一切,我與面試官的那一夜,難忘

小結

透過對

@Async

@Transactional

的實現進行分析後,可以發現一個共同點:使用

@Enablexxx

註解來引入

Bean處理器

和 切面 ,指定 切面 對應的 切點 和 通知 ;透過 Bean的後置處理方法 對符合切點的Bean生成代理並指明設定通知。

【參考文件】

理解原理之後,就可以仿照著

@Async

@Transactional

來實現我們自己的需求,比如列印所有請求的請求引數、請求響應內容、請求耗時等。

類似功能已經可以實現了,但是實現起來還是比較複雜,首先你需要定義一個註解,緊接著要定義切面、切點、通知,然後定義Bean處理器,這麼難還是放棄了吧。彆著急,往下看看

Spring Aop

的實現,你一定會愛不釋手。

Aop實現

@EnableAspectJAutoProxy開啟切面功能

關於AOP的一切,我與面試官的那一夜,難忘

注入AnnotationAwareAspectJAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator

實現

BeanPostProcessor

介面,用作Bean後置處理

Bean是否含有@Aspect註解

關於AOP的一切,我與面試官的那一夜,難忘

關於AOP的一切,我與面試官的那一夜,難忘

建立切點

關於AOP的一切,我與面試官的那一夜,難忘

關於AOP的一切,我與面試官的那一夜,難忘

關於AOP的一切,我與面試官的那一夜,難忘

關於AOP的一切,我與面試官的那一夜,難忘

建立通知

關於AOP的一切,我與面試官的那一夜,難忘

建立切面

關於AOP的一切,我與面試官的那一夜,難忘

Aop實現

@Component@Aspectpublic class SystemLogAspect { /** * 定義切點 */ @Pointcut(“execution(* com。boot。example。controller。*。*(。。))”) public void SystemLogAspect() { } /** * 定義通知 */ @Before(“SystemLogAspect()”) public void doBefore(JoinPoint joinPoint) { } /** * 定義通知 */ @AfterReturning(“SystemLogAspect()”) public void doAfterReturning() { } /** * 定義通知 */ @Around(“SystemLogAspect()”) public void doAround(ProceedingJoinPoint joinPoint) { } /** * 定義通知 */ @AfterThrowing(value = “SystemLogAspect()”, throwing = “ex”) public void doThrowing(JoinPoint joinPoint, Exception ex) { }}

總結

使用

@EnableAspectJAutoProxy

註解開啟Aop功能

定義Bean後置處理器

攔截所有被

@Aspect

註解標註的Bean

獲取Bean中所有沒有被

@Pointcut

標註的方法

@Pointcut@ AroundBefore@After@AfterReturning@AfterThrowingvalue

最後,感謝大家的觀看,謝謝大家的支援,能三連支援一下最好了!

關於AOP的一切,我與面試官的那一夜,難忘