springAOP一
本篇需要解決的問題
- 介紹aspectj和aop關系
- spring aop 中aspect,advice,advisor分别是什麼意義
- 介紹aop有幾種實作方式
- 簡單介紹aop的的底層原理
spring-aop源碼目錄
- aop,aspectj,springaop的曆史
- spring1.2中配置
- spring 2.0 @aspectJ配置
- spring 2.0 schema-based配置
- aspectJ編譯方式實作aop
- spring aop源碼解析
- 切面類的解析
- 建立代理
- 代理類的調用
正文
- aop,aspectj,springAop的曆史
- aop是實作在我們在我們原來代碼基礎上進行一定包裝,比如方法執行前,傳回後,抛出異常後等地方進行一定的攔截處理,增強處理
- aop實作是通過 spring把在方法的幾個生命周期告之,而我們要實作一個代理,實際運作的執行個體是生成的代理類的執行個體
- aspectj和 aop對比如下
- spring aop
- 它基于動态代理來實作,預設的如果使用接口,用jdk提供的動态代理實作
- spring3.2後,spring-core把cglib和asm的源碼包括進來,是以不需要顯示引入依賴
- spring的aop 依賴于 ioc容器進行管理
- spring提供了aspectJ的支援,但隻能用到aspectj的切點解析和比對
- 性能方面,spring aop基于代理,在容器啟動時需要生成代理執行個體,在方法調用上增加了棧的深度,性能上沒有aspectJ好
- aspectj
- 出自 eclipse 基金會
- 靜态織入,通過修改代碼實作,織入的時機可以是編譯期,可以是編譯後,也可以是加載類的時候(比如自定義加載器,或者被織入類加載到jvm前加載,或者在jvm啟動時指定aspectJ agent:-javaagent:xxx/xxx/aspectjweaver.jar )
- aspectj在實際代碼運作前 完成了織入,是以他生成的類是沒有額外運作時開銷的
- spring aop
- spring aop 沿用了aspectJ中的蓋面,但是不依賴其功能實作 ,比如 aspect pointcut before after是spirng自己實作的
- spring配置aop的三種方式
- 基于接口
- 基于xml
- 基于@AspectJ
- spring aop 源碼解析
- spring aop 是通過動态代理實作的,通過一個切面類,在他的類上假如@Aspect注解,定義一個pointcut方法,定義增強方法,就完成了一個對象的切面操作
- 所涉及的一些類操作,
- 找到所有的切面類
- 解析出所有的advice
- 常見動态代理類
- 調用被代理的方法,找到他所有的增強器,增強方法
- 切面類的解析
- spring通過@EnableAspectJAntoproxy開啟aop切面,在注解類上@Import(AspectJAutoProxyRegistrar.class),他實作了ImportBeanDefinitionRegistrar,是以他會通過registerBeanDefinitions為我們容器導入beanDefinition.
- 看源碼,追蹤入口AnnotationAwareAspectJAutoProxyCreator
-
我們看一下他的類繼承關系圖,發現它實作了兩個重要
的接口,BeanPostProcessor和InstantiationAwareBeanPostProcessor ,看instantiationAwareBeanpostprocessor的postProcessorBeforeInstantiation
Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)(InstantiationAwareBeanPostProcessor)
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation
org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator#shouldSkip
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors
org.springframework.aop.aspectj.annotation.BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors
不會,我可以學;落後,我可以追趕;跌倒,我可以站起來!