我們在這一章中繼續上一章的分析。我們在上一章中說到了擷取到了切面類中所有不帶@Pointcut注解的方法,我們看看Spring對我們擷取到的這些方法進行了什麼操作:
getAdvisor
我們先來看一下AspectJExpressionPointcut這個類的UML類圖:
在AspectJExpressionPointcut這個類中主要實作了以下這四大接口:ClassFilter、BeanFactoryAware、MethodMatcher、Pointcut。Pointcut是SpringAOP中定義的接口,用來表示切面的抽象。BeanFactoryAware也是SpringIOC中一個常見的接口,用來設定BeanFactory執行個體。ClassFilter和MethodMatcher是SpringAOP中定義的進行Advisor比對的接口。ClassFilter用來此Advisor是否使用于目标類。MethodMatcher用來比對此Advisor是否可以作用于目标類中的目标方法。那麼AspectJExpressionPointcut這個類就擁有了一下功能:從BeanFactory中擷取Bean、擁有切點表達式、可以用來判斷此切點表達式方法是否适用于目标類、此切點表達式方法是否适用于目标類中的方法。OK,我們繼續看生成AspectJExpressionPointcut的過程。
在這裡我們要看一下AspectJAnnotation這個類。這個類是AbstractAspectJAdvisorFactory中的内部類。從這個類中可以擷取切點表達式和通知類型。
我們把上面擷取Advisor的過程總結一下:循環切面類中的所有不帶@Pointcut注解的方法,接着判斷切面類的方法上是否有:@Before, @Around, @After, @AfterReturning, @AfterThrowing, @Pointcut注解。如果沒有的話,循環下一個方法。如果有這些注解的話,則從這些注解中擷取切點表達式存放到AspectJExpressionPointcut對象中,最後将擷取到的切點表達式類封裝到InstantiationModelAwarePointcutAdvisorImpl這個類中。從上面的分析我們知道InstantiationModelAwarePointcutAdvisorImpl類至少擁有:切點表達式類、切面對象、帶有切點表達式的方法、ReflectiveAspectJAdvisorFactory執行個體。那麼我們最後來分析一下InstantiationModelAwarePointcutAdvisorImpl這個類。
OK下面我們的分析就到了如果從InstantiationModelAwarePointcutAdvisorImpl中擷取Advice的内容。