aop expression支持多个表达式吗?

aop expression支持多个表达式吗?

问题描述:

<aop:config>
    <aop:pointcut id="allServiceMethod" expression="execution (* com.cms.sys.service.*.*(..))" /> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allServiceMethod" /> 
</aop:config>

还有一个
execution (* com.cms.art.service.*.*(..))"
要怎么写?

把两个结合在一块!如:
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的任意类
格式为:
[code="java"]execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)[/code]其中带问号的modifiers-pattern?(public/protected) 和 declaring-type-pattern? throws-pattern? 可以不填

补充:
execution(* ..BookManager.save(..))的解读:
第一颗
代表ret-type-pattern 返回值可任意,
..BookManager 代表任意Pacakge里的BookManager类。
如果写成com.xyz.service.
则代表com.xyz.service下的任意类
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的任意类
save代表save方法,也可以写save* 代表saveBook()等方法
(..) 匹配0个参数或者多个参数的,任意类型
(x,..) 第一个参数的类型必须是X
(x,,,s,..) 匹配至少4个参数,第一个参数必须是x类型,第二个和第三个参数可以任意,第四个必须是s类型。
注意事项:
1. name-pattern千万不要写成*..*Manager ,这样子会把所有第三方类库的Manager比如Spring的PlatformTranstationManager 也加入aop,非常危险。所以最好还是加上项目的package前缀,如"org.springside..*Manager"

  1. 因为有*,会修饰所有方法,有些hibernateTemplate的final的方法不能被cglib修改,会抛warning,无害。

你再定义一个切面就行了嘛,

或者试试用&&

[code="java"]execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)[/code]
关于这段的pattern的详细解释和例子,非常的详细哦哦。
http://blog.csdn.net/terryzero/archive/2009/04/27/4128858.aspx

如果还没理解,看看下面的代码,也是关于Pointcut定义。
[code="java"]
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
private void logSender(){}
@Pointcut("execution(* com.savage.aop.MessageReceiver.*(..))")
private void logReceiver(){}
@Pointcut("logSender() || logReceiver()")
private void logMessage(){}
[/code]
最后一个使用了逻辑运算符,其实在pointcut中是可以使用逻辑运算符的,
另外有&&、!两种运算符。

[url=http://static.springsource.org/spring/docs/2.0.x/reference/aop.html]http://static.springsource.org/spring/docs/2.0.x/reference/aop.html[/url]
spring官网也提供了它逻辑运算符(&& || !)的使用。
使用的一个例子,不过这个例子是注释机制的pointcut,请看
[code="java"]@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {}

@Pointcut("within(com.xyz.someapp.trading..*")
private void inTrading() {}

@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {}[/code]