讓我們假定你所有的服務層類定義在以 'x.y.service' 為根的包內。 為了讓service包(或子包)下所有名字以 'Service' 結尾的類的對象擁有默認的事務語義,你可以做如下的配置:
'x.y.service'
'Service'
下面的配置示例演示了兩個擁有完全不同的事務配置的bean。
在service接口所有的方法上執行的一個業務service方法。這里的定義假設所有的接口都被 放置在service包內,它們的實現被放置在service包的子包內。 如果你按照功能對接口進行分組(例如:包com.xyz.someapp.abc.service,com.xyz.def.service), 則這種情況下這個切點表達式應該是:"execution(* com.xyz.someapp..service.*.*(..))"
在dao接口上定義的所有方法內執行一個數據訪問操作。這個定義假設所有的dao接口定義 在dao包內,實現被放置在了子包內。
任何一個名字以“set”開始的方法的執行:
AccountService 接口定義的任意方法的執行:
AccountService
在service包中定義的任意方法的執行:
在service包或其子包中定義的任意方法的執行:
其他的例子: -------------------------------------------------------------------------------- 兩個數據源,兩個數據庫事務攔截器,兩個數據庫事物切點。 execution組合表達式表述數據庫事務切點: 大部分service類的方法使用數據源txManager-datasourceone,對應事物切點txPointcut-datasourceone,事物攔截器txAdvice-datasourceone; service層PublishService類的幾個方法使用數據源txManager-datasourcetwo,對應事物切點txPointcut-datasourcetwo,事物攔截器txAdvice-datasourcetwo; 一個自定義方法攔截器RuntimeLogInterceptor(攔截每個方法,并記錄每個方法的執行日志),攔截切點runtimeLogInterceptorPoint;
總結一下: --------------------------------------------------------------------------------
1,pointcut既可以定義在一個接口上面(表示實現該接口的類方法將被攔截),同時也可以定義在一個類上面(無接口的情 況,需要強制使用cglib)。在接口上面定義pointcut時無需關心接口實現類的具體位置,只需要定義被攔截的接口及方 法位置。 2,常見的情況: x.y.service..*Service.*(..) x.y.service —— 包“x.y.service” x.y.service.. —— 包“x.y.service”及其子包例如:“x.y.service.abc”,“x.y.service.def”,“x.y.service.ghi”,“x.y.service.jkl”。。。 *Service —— 定義接口(或沒有實現接口的類,需要使用cglib代理)表達式;所有以Service結尾的類或接口,注意不是所有以Service結尾的包名。 *(..) —— 定義方法名,方法參數表達式;任意方法的名稱,任意方法參數。 com.xyz.service.*.*(..) com.xyz.service —— 包“com.xyz.service” *.*(..) —— 任意接口(或沒有實現接口的類,需要使用cglib代理),任意方法,任意參數 在service包下定義的任意方法的執行。 com.xyz.service..*.*(..) com.xyz.service —— 包“com.xyz.service” com.xyz.service.. ——包“com.xyz.service”及其子包 *.*(..) —— 任意接口(或沒有實現接口的類,需要使用cglib代理),任意方法,任意參數
posted on 2009-03-11 10:16 paulwong 閱讀(905) 評論(0) 編輯 收藏 所屬分類: J2EE
Powered by: BlogJava Copyright © paulwong