ThrowsAdvice讓你定義在異常發生時該有什么動作。ThrowsAdvice是一個標示接口,它沒有定義任何必須實現的方法。但
是,實現這個接口的類必須至少有一個如下形式的方法:
void afterThrowing(Throwable throwable);
void afterThrowing(Method method,Object[] args,Object target,Throwable throwable);
第一個方法只接受一個參數:需要拋出的異常。第二個方法接受異常、被調用的方法、參數以及目標對象。除非需要這些外加參數,你只要實現單參數方法就可以了。你的ThrowsAdvice要處理的異常取決于你的方法定義的異常類型。
你也可以在一個類中實現多個afterThrowing方法。代碼如下:
package com.wyq.spring.base.aopinstance;
import org.springframework.aop.ThrowsAdvice;
/**
* @author 作者
* @version 創建時間:2009-11-5 下午05:39:17
* 類說明
*/
public class KwikEMartExceptionAdvice implements ThrowsAdvice {
/*
* 根據拋出異常的類型恰當方法將被調用。注意,除了捕獲和處理異常以外,這些方法都為應用添加了新的行為。
* 這是因為你無法做到這一點。代理對象捕獲異常并且調用合適的ThrowsAdvice方法,如果有的話。ThrowsAdvice
* 被執行后,原來的異常繼續被拋出,并且向其他異常一樣被傳播出去。
*/
public void afterThrowing(NoMoreSquisheesException e){
orderMoreSquishees();
}
public void afterThrowing(CustomerIsBrokeException e){
showCustomerAtmMachine();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 創建代理目標對象 -->
<bean id="kwikEMartTarget" class="com.springinaction.chapter03.store.ApuKwikEMart"></bean>
<!-- 創建通知 -->
<bean id="welcomeAdvice" class="com.springinaction.chapter03.store.WelcomeAdvice"></bean>
<!-- 創建代理對象 -->
<bean id="kwikEMart" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 代理類實現的接口 -->
<property name="proxyInterfaces">
<value>com.springinaction.chaper03.store.kwikEMart</value>
</property>
<!-- 要織入的通知 -->
<property name="interceptorNames">
<list>
<value>welcomeAdvice</value>
</list>
</property>
<!-- 要代理的目標對象 -->
<property name="target">
<ref bean="kwikEMartTarget"/>
</property>
</bean>
</beans>
引入通知:引入通知與前面的通知類型有點不同。其他類型的通知是在目標對象的方法被調用的周圍織入。引入通知給目標對象添加新的方法。
切入點決定了一個特定類的特定方法是否滿足一條特定規則。如果一個方法確實符合,通知就應用到該方法上。Spring的切入點可以讓我們以一種靈活的方式定義在什么地方將通知織入到我們的類中。
Spring根據需要織入通知的類和方法來定義切入點。Spring的切入點框架的核心接口自然史pointcut.
public interface Pointcut{
ClassFilter getClassFilter();//這個接口決定了一個類是否復合通知的要求
MethodMatcher getMethodMatcher();//方法過濾
}
大多數切面是由定義切面行為的通知和定義切面在什么地方執行的切入點組合而成的。Spring認識到這一點,提供了Advisor,
它把通知和切入點組合到一個對象中。
public interface PointcutAdvisor{
Pointcut getPointcut();
Advice getAdvice();
}
大多數Spring自帶的切入點都有一個對應的PointcutAdvisor.這樣方便你在一個地方定義切入點和通知。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 創建代理目標對象 -->
<bean id="maidServiceTarget" class="com.springinaction.chapter03.cleaning.MaidServiceImpl"></bean>
<!-- 創建通知 -->
<bean id="frequentCustomerAdvice" class="com.springinaction.chapter03.cleaning.FrequentCustomerAdvicer"></bean>
<!-- 定義切入點
使用Namedmethodmatcher可以很清楚的指明哪些方法需要使用通知。然而,對于大型應用系統,把每個需要通知的方法都列出來
會使配置文件顯得非常冗長。使用通配符可以幫助我們解決這個問題。
Spring的RegexpMethodPointcut讓你利用正則表達式的力量來定義切入點。這樣你可以使用Perl樣式的正則表達式來定義模式,
以得到你想要的方法。
.匹配任何單個字符
+匹配前一個字符一次或多次
*匹配前一個字符0次或多次
\匹配任何正則表達式符號
-->
<bean id="frequentCustomerPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="mappedName">
<value>order*</value>
</property>
<property name="advice">
<ref bean="frequentCustomerAdvice"/>
</property>
</bean>
<!-- 如果你想匹配所有setXxx方法,我們需要使用.*set*.模板(第一個通配符匹配任何類名) -->
<bean id="queryPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="pattern">
<value>.*get.+By.+</value>
</property>
<property name="advice">
<ref bean="frequentCustomerAdvice"/>
</property>
</bean>
<!-- 定義代理對象 -->
<bean id="maidService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.springinaction.chapter03.cleaning.MaidService</value>
</property>
<property name="interceptorNames">
<list>
<value>frequentCustomerAdvisor</value>
</list>
</property>
<property name="target">
<ref bean="maidServiceTarget"/>
</property>
</bean>
</beans>
posted on 2009-11-06 12:29
王永慶 閱讀(214)
評論(0) 編輯 收藏 所屬分類:
SPRING