让我们假定你所有的服务层类定义在以 '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 阅读(902) 评论(0) 编辑 收藏 所属分类: J2EE
Powered by: BlogJava Copyright © paulwong