Spring 2.x AOP 配置方式整理
讓我們假定你所有的服務層類定義在以 'x.y.service'
為根的包內。 為了讓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
接口定義的任意方法的執行:

在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 閱讀(906) 評論(0) 編輯 收藏 所屬分類: J2EE