Spring EL表達式::
1、execution 表達式
語法格式: execution(返回類型.包名.類名.方法名(參數表))
exection(*.com.xxx.AService.*(..))
com.xxx.AService 類型中的任意方法,任意類型返回結果,參數表不限定,都增加切面
應用:最常用。也是相對最通用。根據方法執行的標准,定義切點 如 事務 日志
<aop:config>
<aop:pointcut expression="execution(* com.bjsxt.test.Demo.demo1(..))" id="mypoint"/>
</aop:config>
2、target 表達式
以目標對象作為切點的表達式定義方式 (用於某一個接口or某一類接口)
語法:target(包名.接口名)
如:target(com.xx.IA) 所有實現了IA接口的實現類,作為代理的目標對象,會自動增加通知的織入,是實現切面
應用:為某一個具體的接口實現提供的配置。如 登錄的時候需要執行的附屬邏輯是比較多的。在不同的業務流程中,附屬邏輯也不同。如,電商中,可能在登錄的時候需要去執行購物車合並
<aop:config> <aop:pointcut expression="target(com.bjsxt.aop.TestService)" id="mypoint"/> </aop:config>
3、this 表達式
實現某接口的任意代理對象都作為切點
語法:this(包名.接口名)
如:this(com.xxx.IA) 代理對象 Proxy如果實現了IA接口,則作為連接點
應用:針對某個具體的代理提供的配置。比target切點粒度細致。因為目標對象可以多實現。代理對象可以針對目標對象實現的多個接口的某一個接口,提供特定的切點。如,銀行中的登錄,銀行中的賬戶種類非常多,且有交叉。如借記卡,貸記卡,借記還貸卡。。。。可以針對還貸接口提供一個切點,做還貸信息 的記錄等。
<aop:config> <aop:pointcut expression="this(com.bjsxt.aop.TestService)" id="mypoint"/> </aop:config>
4、 within 表達式
以包作為目標,定義切點
語法: within(包名.*) 代表在包中的任意接口或類型都作為切點
應用:針對某一個包提供的切點,粒度比target粗糙。如:某包中的所有接口都需要執行某附屬邏輯。如 電商平台中的下訂單。下訂單服務中可能需要特定的邏輯(時間戳校驗,庫存檢查等),這些邏輯,是其他業務線中不需要提供切面的
<aop:config> <aop:pointcut expression="within (com.bjsxt.aop.*)" id="mypoint"/> </aop:config>
5、args表達式
以參數標准作為目標,定義切點
語法: args(類型,類型.....) 代表方法的參數表符合要求的時候,作為切點,參數表是有順序的
應用:主要應用在參數校驗中。如:登錄的時候必須傳遞兩個字符串參數(登錄名和密碼)。可以使用args來限定。配合這execution實現。如:execution(.*.xxx.*.login(..)) args(String,String)。是使用頻率最低的表達式
<aop:config> <aop:pointcut expression="args (java.lang.String)" id="mypoint"/> </aop:config>