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.*.*(..))"
要怎么写?
也可以这样写:将execution分开写。
[code="xml"] aop:config
/aop:config
[code]
老外喜欢吧逻辑运算符用OR,and !写,国内一般用|| && !。
参考E文详细的资料:
[url=http://www.jboss.org/file-access/default/members/jbossaop/freezone/docs/2.0.0.GA/docs/aspect-framework/reference/en/html/annotated.html
]http://www.jboss.org/file-access/default/members/jbossaop/freezone/docs/2.0.0.GA/docs/aspect-framework/reference/en/html/annotated.html[/url][url=http://www.jboss.org/file-access/default/members/jbossaop/freezone/docs/2.0.0.GA/docs/aspect-framework/reference/en/html/pointcuts.html]http://www.jboss.org/file-access/default/members/jbossaop/freezone/docs/2.0.0.GA/docs/aspect-framework/reference/en/html/pointcuts.html[/url]
把两个结合在一块!如:
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"
- 因为有*,会修饰所有方法,有些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]