Spring ( AOP )筆記
阿新 • • 發佈:2018-12-12
Aop
- 通知方法
- 前置通知 (@Before
)
- 後置通知(@After
)
- 返回通知(@AfterReturning
)
- 異常通知(@AfterThrowing
)
- 過程
- 首先建立被代理類和代理類
- 在代理類上標註@Aspect註解,然後在不同的通知方法上標註不同的通知註解
- 例@Before
的引數填寫被代理類中的方法引用(方法的許可權定名)
- 除了在註解中寫方法引用,還可以使用@PointCut
註解,註解引數可以填寫execution表示式作為value值,建立一個空方法體的方法,標註@PointCut
,其他通知註解如果想使用這個切點表示式,將@PointCut
@Before("pointCut()")
- execution表示式
execution(<修飾符模式>?<返回型別模式><方法名模式>(<引數模式>)<異常模式>?)
,切點表示式中方法入參部分比較複雜,可以使用””和“…”萬用字元,其中“”表示任意型別的引數,而“…”表示任意型別引數且引數個數不限。- 如果想在代理類中的代理方法中使用執行是被代理類的資訊,可以在代理方法中填寫JoinPoint型別的引數,注意一點,如果填寫JoinPoint引數,這個引數必須是方法引數列表的第一個.
- 返回通知
@AfterReturning
returning="result"
引數,可以再方法引數填寫Object result
,隨後在方法體內可以使用.- 異常通知
@AfterThrowing
除了可以寫value引數,還可以有throwing引數,如果標註了throwing="exception"
引數,可以再方法引數填寫Exception exception
,如果發生異常,會呼叫並返回異常資訊
AOP原理 (很亂,別看)
- @EnableAspectJAutoProxy
- 註解內部
@Import(AspectJAutoProxyRegistrar.class)
AspectJAutoProxyRegistrar
元件 AspectJAutoProxyRegistrar
元件自定義給容器注入bean,AnnotationAwareAspectJAutoProxyCreator
看一下這個bean的繼承樹
- 可以看到這個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