1、動態AOP自定義標籤:
我們可以得知,在解析配置文件的時候,一旦遇到aspectj-autoproxy註解就會使用解析器AspectJAutoProxyBeanDefinitionParser進行解析,其中registerAspectJAnnotationAutoProxyCreatorIfNecessary方法中主要完成了3件事情:
1)註冊或者升級AnnotationAwareAspectJAutoProxyCreator;
2)處理proxy-target-class以及expose-proxy屬性:Spring AOP部分使用JDK動態代理或者CGLIB來爲目標對象創建代理(建議儘量使用JDK的動態代理)。如果被代理的目標對象實現了至少一個接口,則會使用JDK動態代理,所有該目標類型實現的接口都將被代理。若該目標對象沒有實現任何接口,則創建一個CGLIB代理。
2、創建AOP代理
- 獲取增強器:
1)獲取所有beanName,這一步驟中所有在BeanFactory中註冊的bean都會被提取出來;
2)遍歷所有beanName,並找出聲明AspectJ註解的類,進行進一步的處理;
3)對標記爲AspectJ註解的類進行增強器的提取;
4)將提取結果加入緩存。
- 創建代理:
1)獲取當前類中的屬性;
2)添加代理接口;
3)封裝Advisor並加入到ProxyFactory中;
4)設置要代理的類;
5)當然在Spring中還爲子類提供了定製的函數customizeProxyFactory,子類可以在此函數中進行對ProxyFactory的進一步封裝;
6)進行獲取代理操作。
3、靜態AOP使用示例
1)全局配置文件的修改,加入LWT開關;
2)加入aop.xml;
3)加入啓動參數;
4)測試。
4、創建AOP靜態代理:AOP靜態代理主要是在虛擬機啓動時通過改變目標對象字節碼的方式來完成對目標對象的增強,它與動態代理相比具有更高的效率,因爲在動態代理調用的過程中,還需要一個動態創建代理類並代理目標對象的步驟,而靜態代理則是在啓動時便完成了字節碼增強,當系統再次調用目標類時與調用正常的類並無差別,所以在效率上會相對高些。