本文是《詳細解讀 Spring AOP 面向切麵編程(一)》的續集。 在上篇中,我們從寫死代碼,到使用代理;從編程式 Spring AOP 到聲明式 Spring AOP。一切都朝著簡單實用主義的方向在發展。沿著 Spring AOP 的方向,Rod Johnson(老羅)花了不少心思,都是為了讓我 ...
本文是《詳細解讀 Spring AOP 面向切麵編程(一)》的續集。
在上篇中,我們從寫死代碼,到使用代理;從編程式 Spring AOP 到聲明式 Spring AOP。一切都朝著簡單實用主義的方向在發展。沿著 Spring AOP 的方向,Rod Johnson(老羅)花了不少心思,都是為了讓我們使用 Spring 框架時不會感受到麻煩,但事實卻並非如此。那麼,後來老羅究竟對 Spring AOP 做了哪些改進呢?
現在繼續!
9. Spring AOP:切麵
之前談到的 AOP 框架其實可以將它理解為一個攔截器框架,但這個攔截器似乎非常武斷。比如說,如果它攔截了一個類,那麼它就攔截了這個類中所有的方法。類似地,當我們在使用動態代理的時候,其實也遇到了這個問題。需要在代碼中對所攔截的方法名加以判斷,才能過濾出我們需要攔截的方法,想想這種做法確實不太優雅。在大量的真實項目中,似乎我們只需要攔截特定的方法就行了,沒必要攔截所有的方法。於是,老羅同志藉助了 AOP 的一個很重要的工具,Advisor(切麵),來解決這個問題。它也是 AOP 中的核心!是我們關註的重點!
也就是說,我們可以通過切麵,將增強類與攔截匹配條件組合在一起,然後將這個切麵配置到 ProxyFactory 中,從而生成代理。
這裡提到這個“攔截匹配條件”在 AOP 中就叫做 Pointcut(切點),其實說白了就是一個基於表達式的攔截條件罷了。
歸納一下,Advisor(切麵)封裝了 Advice(增強)與 Pointcut(切點 )。當您理解了這句話後,就往下看吧。
我在 GreetingImpl 類中故意增加了兩個方法,都以“good”開頭。下麵要做的就是攔截這兩個新增的方法,而對 sayHello() 方法不作攔截。