程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring中基於aop命名空間的AOP 二(聲明一個切面、切入點和通知)

Spring中基於aop命名空間的AOP 二(聲明一個切面、切入點和通知)

編輯:關於JAVA

2、聲明一個切面

在基於AOP命名空間的Spring AOP中,要聲明一個切面,需要使用<aop:config/>的子標簽 <aop:aspect>。<aop:aspect>標簽有一個ref屬性必須被賦值,它用於指定和該切面關聯的 受管Bean(backing bean,以後我們都將使用Backing Bean來稱呼這樣的Bean)。正如下例所示,該Bean 對應的java類是一個普通的java類,在該類中定義了切面的通知方法。此外,<aop:aspect>標簽還 有兩個可選的order屬性和id屬性,order屬性用於指定該切面的加載順序,id屬性用於標識該切面。范例 如下:

代碼

<?xml version="1.0" encoding="UTF-8"?>
<beans ……>
<bean id="MyAspect" class="aop.test.MyAspect" />
<aop:config proxy-target-class="true">
<aop:aspect ref="MyAspect" order="1" id="TestAspectName">
……切面其他配置
</aop:aspect>
</aop:config>
……其他配置
</beans>

3、聲明一個切入點

要聲明一個切入點,可以使用<aop:aspect>的子標簽<aop:pointcut>,在Spring2.5中它 有兩個屬性id和expression,分別用於標示該切入點和設定該切入點表達式。例如:

代碼

<?xml version="1.0" encoding="UTF-8"?>
<beans ……>
<bean id="MyAspect" class="aop.test.MyAspect"/>
<aop:config proxy-target-class="true">
<aop:aspect ref="MyAspect" order="1" id=”TestAspectName”>
<aop:pointcut id="test"
expression="execution(* aop.test.TestBean.*(..))"/>
<aop:before pointcut="aop.test.MyAspect.Pointcut1()"
method="beforeAdvice" />
</aop:aspect>
</aop:config>
……其他配置
</beans>

aop:pointcut>標簽的expression屬性使用前面介紹的切入點表達式語言,也就是說支持AspectJ切 入點表達式。但是由於xml對"&&"、"||"、"!"等邏輯運算符不友好,@AspectJ切入點表達式語言 中使用的這些邏輯運算符在xml配置中需要分別用"and"、"or"和"not"來代替。

有時候,我們也需要在xml中使用@Pointcut注解聲明的切入點,那麼該如何呢?大家可能記得,我們 可以在切入點表達式中可以引用另一個切入點。對了,就在這裡,我們使用該特性可以完成這個任務,如 下:

代碼

<aop:pointcut id="test" expression="aop.test.MyAspect.Pointcut1()" />

注意:這裡我們必須使用全路徑來標示引用的切入點。

4、聲明一個通知

和@AspectJ一樣,基於AOP命名空間的配置也可以定義五種通知類型,並且使用方式和特性類似。與 @AspectJ不同的是,配置信息從Annotation中轉移到了xml配置文件。

1)、前置通知

聲明一個前置通知可以使用<aop:aspect>的子標簽<aop:before/>。該標簽的屬性說明如 下表:

<aop:before/>標簽屬性說明

屬性 說明 pointcut 指定該通知的內置切入點 pointcut-ref 通過 id 引用已定義的切入點 method 指定通知對應的方法,該方法必須已在切面的 backing bean 中被聲明 arg-names 通過方法的參數名字來匹配切入點參數

對於一個通知來說,切入點和對應的通知方法是必須的。也就是說,在這些屬性中,method屬性是必 須的,我們必須要給通知指定一個對應的方法;pointcut屬性和pointcut-ref必須有一個被指定,以此確 定該通知的切入點。范例如下:

代碼

<aop:aspect ref="MyAspect" order="0" id="Test">
<aop:pointcut id="testPointcut"
expression="execution(* aop.test.TestBean.*(..))"/>
<aop:before pointcut-ref="testPointcut" method="beforeAdvice"/>
</aop:aspect>

2)、後置通知

聲明一個後置通知使用<aop:after/>標簽,它的屬性等和<aop:before/>標簽類似,下面 是范例:

代碼

<aop:aspect ref="MyAspect" order="0" id="Test">
<aop:pointcut id="testPointcut"
expression="execution(* aop.test.TestBean.*(..))" />
<aop:after pointcut-ref="testPointcut" method="AfterAdvice"/>
</aop:aspect>

3)、返回後通知

<aop:after-returning/>標簽可以聲明一個返回後通知,該標簽的屬性和<aop:before/> 相比它多了一個returning屬性。該屬性的意義類似於@AfterReturning注解的returning屬性,用於將鏈 接點的返回值傳給通知方法。用法如下:

代碼

<aop:aspect ref="MyAspect" order="0" id="Test">
<aop:pointcut id="testPointcut"
expression="execution(* aop.test.TestBean.*(..))" />
<aop:after-returning pointcut-ref="testPointcut"
method="AfterReturnAdvice" returning="reVlue" />
</aop:aspect>

4)、異常通知

聲明一個異常通知使用<aop:after-throwing />標簽,它有一個類似於throwing屬性又來指定 該通知匹配的異常類型。用法如下:

<aop:aspect ref="MyAspect" order="0" id="Test">
<aop:pointcut id="testPointcut"
expression="execution(* aop.test.TestBean.*(..))" />
<aop:after-throwing pointcut-ref="testPointcut"
method="afterThrowingAdvice" throwing="throwable" />
</aop:aspect>

5)、環繞通知

環繞通知是所有通知中功能最強大的通知,用<aop:around/>標簽來聲明。用法如下:

代碼

<aop:aspect ref="MyAspect" order="0" id="Test">
<aop:pointcut id="testPointcut"
expression="execution(* aop.test.TestBean.*(..))" />
<aop:around pointcut-ref="testPointcut" method="aroundAdvice"/>
</aop:aspect>

(完)

http://www.blogjava.net/cmzy/archive/2008/08/25/224120.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved