1. 程式人生 > >Spring ( AOP )筆記

Spring ( AOP )筆記

Aop

- 通知方法
- 前置通知 (@Before)
- 後置通知(@After)
- 返回通知(@AfterReturning)
- 異常通知(@AfterThrowing)
- 過程
- 首先建立被代理類和代理類
- 在代理類上標註@Aspect註解,然後在不同的通知方法上標註不同的通知註解
- 例@Before的引數填寫被代理類中的方法引用(方法的許可權定名)
- 除了在註解中寫方法引用,還可以使用@PointCut註解,註解引數可以填寫execution表示式作為value值,建立一個空方法體的方法,標註@PointCut,其他通知註解如果想使用這個切點表示式,將@PointCut

標註的方法的方法名作為值填入即可,例@Before("pointCut()")
- execution表示式execution(<修飾符模式>?<返回型別模式><方法名模式>(<引數模式>)<異常模式>?),切點表示式中方法入參部分比較複雜,可以使用””和“…”萬用字元,其中“”表示任意型別的引數,而“…”表示任意型別引數且引數個數不限。
- 如果想在代理類中的代理方法中使用執行是被代理類的資訊,可以在代理方法中填寫JoinPoint型別的引數,注意一點,如果填寫JoinPoint引數,這個引數必須是方法引數列表的第一個.
- 返回通知@AfterReturning
除了可以寫value引數,還可以有returning引數,如果標註了returning="result"引數,可以再方法引數填寫Object result,隨後在方法體內可以使用.
- 異常通知@AfterThrowing除了可以寫value引數,還可以有throwing引數,如果標註了throwing="exception"引數,可以再方法引數填寫Exception exception,如果發生異常,會呼叫並返回異常資訊

AOP原理 (很亂,別看)

  • @EnableAspectJAutoProxy
    • 註解內部@Import(AspectJAutoProxyRegistrar.class)
      :給容器匯入AspectJAutoProxyRegistrar元件
    • AspectJAutoProxyRegistrar元件自定義給容器注入bean,AnnotationAwareAspectJAutoProxyCreator看一下這個bean的繼承樹
      F10s8f.png
    • 可以看到這個bean在底層實現了BeanPostProcessor(Bean建立前後做了什麼)和BeanFactoryAware(如何建立),我們需要搞清楚這兩個bean做了什麼
    • 從Main開始的流程
      • 傳入配置類,建立ioc容器
      • 註冊配置類,呼叫refresh(),重新整理容器
      • registerBeanPostProcessor(beanFactory);註冊bean的後置處理器BeanPostProcessor方便攔截bean的建立
        • 先獲取ioc容器已經定義了的需要建立物件的所有BeanPostProcessor
        • 給容器中註冊別的BeanPostProcessor
        • 優先註冊實現類PriorityOrderd介面的BeanPostProcessor
        • 再給容器註冊實現了Ordered介面的BeanPostProcessor
        • 註冊沒有實現優先順序介面的BeanPostProcessor
        • 所謂的註冊,就是建立BeanPostProcessor物件,儲存在容器中.
          • 建立bean的例項
          • populateBean 給bean賦值
          • 初始化bean
            • 處理Aware介面的回撥
            • 呼叫初始化前的方法
            • 呼叫初始化方法
            • 呼叫初始化後的方法
          • BeanPostProcessor建立成功,
        • BeanPostProcessor註冊到BeanFactory
        • 以上是建立後置處理器的過程,建立BeanPostProcessor的作用是,為以後建立bean提供後置處理器
      • 完成BeanFactory的初始化工作,建立剩下的單例項bean
        • 遍歷容器內的bean,依次建立物件
        • 首先getBean從快取中獲取bean,如果存在,就不建立,否則再建立,只要建立好的bean,都會被快取起來
        • 建立bean
          • 希望後置處理器能返回一個代理物件,如果不能返回,到下一步
          • 真正的建立一個bean例項
          • 後置處理器返回代理物件,

看不懂了,先不寫了

Spring 事務

  • 配置資料來源-配置類中的@Bean
  • 建立JdbcTemplate操作資料
  • 給需要新增事務的方法標註@Transactional表示當前方法是一個事務方法
  • 給配置類新增@EnableTransactionManagement開啟事務管理功能
  • 在配置類中新增事務管理器來控制事務@Bean方法返回一個PlatformTransactionManage型別物件,一般是DataSourceTransactionManager