1. 程式人生 > >SpringAOP環繞通知的使用

SpringAOP環繞通知的使用

上一篇文章介紹了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>