1. 程式人生 > >【Spring註解驅動開發】AOP核心類解析,這是最全的一篇了!!

【Spring註解驅動開發】AOP核心類解析,這是最全的一篇了!!

## 寫在前面 > 昨天二狗子讓我給他講@EnableAspectJAutoProxy註解,講到AnnotationAwareAspectJAutoProxyCreator類的原始碼時,二狗子消化不了了。這不,今天又來讓我給他講講AOP的核心類。那我們就開始吧! > > 關於 **冰河技術** 微信公眾號,後臺回覆 “Spring註解”領取原始碼工程。 > > 如果文章對你有點幫助,麻煩點個贊,給個在看和轉發,大家的三連是對我持續創作最大的動力!! ## 類結構圖 我們先來看下AnnotationAwareAspectJAutoProxyCreator類的結構圖。 ![](https://img-blog.csdnimg.cn/20200903212516317.png) 上圖中一些 **類/介面** 的介紹: **AspectJAwareAdvisorAutoProxyCreator** : 公開了AspectJ的呼叫上下文,並弄清楚來自同一切面的多個Advisor在AspectJ中的優先順序規則。 **AbstractAdvisorAutoProxyCreator** : 通用自動代理建立器,它基於檢測到的每個顧問程式為特定bean構建AOP代理。 **AbstractAutoProxyCreator** : 擴充套件了 ProxyProcessorSupport,實現了SmartInstantiationAwareBeanPostProcessor、BeanFactoryAware 介面,是BeanPostProcessor 實現,該實現使用AOP代理包裝每個合格的bean,並在呼叫bean本身之前委派給指定的攔截器。 **BeanFactoryAware** : 實現了該介面的Bean可以知道它屬於那個 BeanFactory,Bean可以通過Spring容器查詢它的協同者(依賴查詢),但大多數的Bean是通過構造器引數和Bean方法(依賴注入)來獲取它的協同者。 **BeanPostProcessor** :工廠鉤子,允許自定義修改新的bean例項。例如,檢查標記介面或使用代理包裝bean。**如果我們需要在Spring容器中完成Bean的例項化,配置和其初始化前後新增一些自己的邏輯處理,我們就可以定義一個或多個BeanPostProcessor介面的實現,然後註冊到容器中。** **InstantiationAwareBeanPostProcessor** : BeanPostProcessor 的子介面,它添加了例項化之前的回撥,以及例項化之後但設定了顯式屬性或自動裝配之前的回撥。它內部提供了3個方法,再加上BeanPostProcessor介面內部的2個方法,實現這個介面需要實現5個方法。InstantiationAwareBeanPostProcessor 介面的主要作用在於目標物件的例項化過程中需要處理的事情,包括例項化物件的前後過程以及例項的屬性設定。 **SmartInstantiationAwareBeanPostProcessor** : InstantiationAwareBeanPostProcessor 介面的擴充套件,多出了3個方法,添加了用於預測已處理bean的最終型別的回撥,再加上父介面的5個方法,所以實現這個介面需要實現8個方法,主要作用也是在於目標物件的例項化過程中需要處理的事情。 **總之:** AspectJAwareAdvisorAutoProxyCreator為 AspectJ 切面類建立自動代理。 ## 核心類解析 **BeanPostProcessor** 介面中的兩個方法 postProcessBeforeInitialization 和 postProcessAfterInitialization,作用是對**Bean初始化前後**新增一些自己的邏輯。 ```java @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } ``` **InstantiationAwareBeanPostProcessor** 是 **BeanPostProcessor** 的子介面,它額外增加了3個新的方法:postProcessBeforeInstantiation( 目標物件被**例項化之前**呼叫的方法,可以返回目標例項的一個代理用來代替目標例項 )、postProcessAfterInstantiation(該方法在Bean**例項化之後**執行,返回false,會忽略屬性值的設定;如果返回true,會按照正常流程設定屬性值) 和 postProcessPropertyValues(對屬性值進行修改,未來版本將會刪除) ```java @Nullable default Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException { return null; } default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { return true; } @Nullable default PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { return pvs; } ``` **SmartInstantiationAwareBeanPostProcessor**介面繼承InstantiationAwareBeanPostProcessor介面,裡面定義了3個方法:predictBeanType(預測Bean的型別)、determineCandidateConstructors(選擇合適的構造器)、getEarlyBeanReference(解決迴圈引用問題)。 ```java @Nullable default Class predictBeanType(Class beanClass, String beanName) throws BeansException { return null; } @Nullable default Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException { return null; } default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException { return bean; } ``` **AbstractAutoProxyCreator** 是AOP的一個核心類,它實現了SmartInstantiationAwareBeanPostProcessor、BeanFactoryAware 介面,實現了代理建立的邏輯,使用AOP代理包裝每個合格的bean,並在呼叫bean本身之前委派給指定的攔截器。 **AbstractAdvisorAutoProxyCreator** 通用自動代理建立器,它基於檢測每個bean的增強器,為特殊的bean構建AOP代理。子類可以重寫此findCandidateAdvisors()方法,以返回適用於任何物件的advisor的自定義列表,子類還可以重寫繼承的AbstractAutoProxyCreator.shouldSkip()方法,以將某些物件排除在自動代理之外。 ```java protec