前言
Aop 是一個高頻出現的技術點,不管在你的日常開發中還是在跳槽面試中,始終會看到它的影子。如此的高頻,證明了它的重要性,既然這麼重要,就沒有理由不去搞清楚它。
在弄清楚 Aop 之前先來看看非同步
@Async 和事務
@Transactional
的相關實現。
@Async實現
@Async
在這篇文章 你必須懂也可以懂的
@Async
原理 中做過詳細介紹,主要用來在應用實現非同步功能。
@EnableAsync開啟非同步功能
若要在應用中使用
@Async
來實現非同步功能,需要使用
@EnableAsync
註解來開啟非同步功能
注入ProxyAsyncConfiguration
@EnableAsync
註解引入了非同步配置選擇器
AsyncConfigurationSelectorbing
並向IOC容器中注入了
ProxyAsyncConfiguration
建立非同步註解處理器AsyncAnnotationBeanPostProcessor
ProxyAsyncConfiguration
中建立
AsyncAnnotationBeanPostProcessorBean處理器
建立切面
建立切點
建立通知
Bean後置處理
@Transactional實現
@EnableAsync開啟非同步功能
注入ProxyTransactionManagementConfiguration配置類
建立切面
建立切點
建立通知
注入InfrastructureAdvisorAutoProxyCreator
InfrastructureAdvisorAutoProxyCreator
實現了
BeanPostProcessor
介面,因此會攔截所有的Bean進行處理
小結
透過對
@Async
和
@Transactional
的實現進行分析後,可以發現一個共同點:使用
@Enablexxx
註解來引入
Bean處理器
和 切面 ,指定 切面 對應的 切點 和 通知 ;透過 Bean的後置處理方法 對符合切點的Bean生成代理並指明設定通知。
【參考文件】
理解原理之後,就可以仿照著
@Async
和
@Transactional
來實現我們自己的需求,比如列印所有請求的請求引數、請求響應內容、請求耗時等。
類似功能已經可以實現了,但是實現起來還是比較複雜,首先你需要定義一個註解,緊接著要定義切面、切點、通知,然後定義Bean處理器,這麼難還是放棄了吧。彆著急,往下看看
Spring Aop
的實現,你一定會愛不釋手。
Aop實現
@EnableAspectJAutoProxy開啟切面功能
注入AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator
實現
BeanPostProcessor
介面,用作Bean後置處理
Bean是否含有@Aspect註解
建立切點
建立通知
建立切面
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
最後,感謝大家的觀看,謝謝大家的支援,能三連支援一下最好了!