天天看點

springAOP一

springAOP一

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

    的接口,BeanPostProcessor和InstantiationAwareBeanPostProcessor ,看instantiationAwareBeanpostprocessor的postProcessorBeforeInstantiation

    springAOP一

    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

    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一

不會,我可以學;落後,我可以追趕;跌倒,我可以站起來!