在上篇中,我們從寫死代碼,到使用代理;從編程式 Spring AOP 到聲明式 Spring AOP,
AOP 那點事兒(續(xù)集)
。一切都朝著簡單實用主義的方向在發(fā)展。沿著 Spring AOP 的方向,Rod Johnson(老羅)花了不少心思,都是為了讓我們使用 Spring 框架時不會感受到麻煩,但事實卻并非如此。那么,后來老羅究竟對 Spring AOP 做了哪些改進呢?現(xiàn)在繼續(xù)!
9. Spring AOP:切面
之前談到的 AOP 框架其實可以將它理解為一個 框架,但這個 似乎非常武斷。比如說,如果它攔截了一個類,那么它就攔截了這個類中所有的方法。類似地,當我們在使用動態(tài)代理的時候,其實也遇到了這個問題。需要在代碼中對所攔截的方法名加以判斷,才能過濾出我們需要攔截的方法,想想這種做法確實不太優(yōu)雅。在大量的真實項目中,似乎我們只需要攔截特定的方法就行了,沒必要攔截所有的方法。于是,老羅同志借助了 AOP 的一個很重要的工具,Advisor(切面),來解決這個問題。它也是 AOP 中的核心!是我們關注的重點!
也就是說,我們可以通過切面,將增強類與攔截匹配條件組合在一起,然后將這個切面配置到 ProxyFactory 中,從而生成代理。
這里提到這個“攔截匹配條件”在 AOP 中就叫做 Pointcut(切點),其實說白了就是一個基于表達式的攔截條件罷了。
歸納一下,Advisor(切面)封裝了 Advice(增強)與 Pointcut(切點 )。當您理解了這句話后,就往下看吧。
我在 GreetingImpl 類中故意增加了兩個方法,都以“good”開頭。下面要做的就是攔截這兩個新增的方法,而對 sayHello() 方法不作攔截。
@Componentpublic class GreetingImpl implements Greeting { @Override public void sayHello(String name) { System.out.println("Hello! " + name); } public void goodMorning(String name) { System.out.println("Good Morning! " + name); } public void goodNight(String name) { System.out.println("Good Night! " + name); }}
在 Spring AOP 中,老羅已經(jīng)給我們提供了許多切面類了,這些切面類我個人感覺最好用的就是基于正則表達式的切面類,
電腦資料
《AOP 那點事兒(續(xù)集)》(http://m.clearvueentertainment.com)?纯茨兔靼琢耍<b><b><b></bean></bean></beans>
使用 元素來進行 AOP 配置,在其子元素中配置切面,包括增強類型、目標方法、切點等信息。
無論您是不能使用注解,還是不愿意使用注解,Spring AOP 都能為您提供全方位的服務。
好了,我所知道的比較實用的 AOP 技術都在這里了,當然還有一些更為高級的特性,由于個人精力有限,這里就不再深入了。
還是依照慣例,給一張牛逼的高清 思維導圖,總結(jié)一下以上各個知識點:
再來一張表格,總結(jié)一下各類增強類型所對應的解決方案:
增強類型基于 AOP 接口基于 @Aspect基于Before Advice(前置增強)MethodBeforeAdvice@BeforeAfterAdvice(后置增強)AfterReturningAdvice@AfterAroundAdvice(環(huán)繞增強)MethodInterceptor@AroundThrowsAdvice(拋出增強ThrowsAdvice@AfterThrowingIntroductionAdvice(引入增強)DelegatingIntroductionInterceptor@DeclareParents最后給一張 UML 類圖描述一下 Spring AOP 的整體架構(gòu):