spring中的Advice按照其自身實例(instance)能否自目標對象類的所有實例中共享這一標准,可以划分成為兩大類:
1.pre-class:該類型的Advice的實例可以再目標對象類的說有實例之間共享,這些Advice不會保存類狀態和信息,這類Advice有:
1.before Advice: 只需要實現 aop.MethodBeforeAdvice接口。
2.ThrowsAdvice:以接口定義aop.ThrowsAdvice對應通常Aop概念中的After Throwing Advice
3.After Returning Advice
4.Around Advice
2.per-instance類型的Advice只有一種,就是 Introduction,可以在不改動目標類定義的情況下,為目標類添加新的屬性和行為。
spring AoP中的Aspect:Advisor代表spring中的Aspect,但是與正常的Aspect不同,advice通常只持有一個Pointcut和一個Advice.Advisor有兩種實現體系,可簡單的分為兩個分支aop.PointcutAdvisor.IntroductionAdvisor.
PointcutAdvisor是真正定義的一個Pointcut和Advice
幾個常用的實現:
- DefaultPointAdvisor:是最通用的pointcutAdvisor實現,除了不能 為其制定Introduction類型的Advice,其他剩下的pointcut,advice都可以通過他來實現。
- NameMatchMethodPointcutAdvisor:自身限定使用的Pointcut類型為NameMatchMethodPointcut
- RegexpMethodPointcutAdvisor:自身限定使用Pointcut類型為正則表達式的pointcut
- DefaultBeanFactoryPointcutAdvisor:使用這個Advisor需要綁定到spring的IoC容器中,作用是通過容器的Advice注冊的beanName來關聯對應的Advice,只有當對象的pointcut匹配成功之后,才去實例化對應的advice,減少容器啟動初期的Advisor和advice之間的耦合性
IntroductionAdvisor分支:IntroductionAdvisor與pointcutAdvisor最本質上的區別就是:IntroductionAdvisor只能應用類級別的攔截。
Order:當存在多個advisor的pointcut匹配同一個joinpoint是,多個橫切邏輯作用於同個joinpoint時,可使用order對邏輯執行順序進行排序