SpringAOP環繞通知的使用
阿新 • • 發佈:2019-01-11
上一篇文章介紹了SpringAOP的概念以及簡單使用:SpringAOP概念及其使用
在springAOP中有五種通知,環繞通知是最為強大的通知。它能夠讓你編寫的邏輯將被通知的目標方法完全包裝起來。實際上就像在一個通知方法中同時編寫前置通知和後置通知。
本片文章具體講解環繞通知的使用。
使用註解
使用環繞通知定義切面:
@Aspect
public class AudienceAround {
//使用@Pointcut註解宣告頻繁使用的切入點表示式
@Pointcut("execution(* com.wqh.concert.Performance.perform(..))" )
public void performance(){}
@Around("performance()")
public void watchPerformance(ProceedingJoinPoint joinPoint){
try {
System.out.println("Silencing cell phones");
System.out.println("Taking seats");
joinPoint.proceed();
System.out .println("Demanding a refund");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
可以看到在上面的程式碼中,定義通知的時候在通知方法中添加了入參:ProceedingJoinPoint。在建立環繞通知的時候,這個引數是必須寫的。因為在需要在通知中使用ProceedingJoinPoint.proceed()方法呼叫被通知的方法。
另外,如果忘記呼叫proceed()方法,那麼通知實際上會阻塞對被通知方法的呼叫。
在XML中定義
首先去掉上面類的所有註解:這裡為了區別就重新建立一個類
public class AudienceAroundXML {
public void watchPerformance(ProceedingJoinPoint joinPoint){
try {
System.out.println("Silencing cell phones");
System.out.println("Taking seats");
joinPoint.proceed();
System.out.println("Demanding a refund");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
配置:
<!--宣告bean-->
<bean name="audienceAroundXML" class="com.wqh.concert.AudienceAroundXML"/>
<!--配置切面及通知-->
<aop:config>
<aop:aspect ref="audienceAroundXML">
<aop:pointcut id="performance"
expression="execution(* com.wqh.concert.Performance.perform(..))"/>
<aop:around method="watchPerformance" pointcut-ref="performance"/>
</aop:aspect>
</aop:config>