欢迎转载交流: http://www.cnblogs.com/shizhongtao/p/3476973.html
下面的文字来自官方文档的翻译,具体事例以后奉上。
Advisors
"advisors"这个概念来自Spring1.2对AOP的支持,在AspectJ中是没有等价的概念。 advisor就像一个小的自包含的切面,这个切面只有一个通知。 切面自身通过一个bean表示,并且必须实现一个通知接口。Advisors可以很好的利用AspectJ切入点表达式。
Spring 2.0 通过 <aop:advisor> 元素来支持advisor 概念。 你将会发现它大多数情况下会结合transactional advice使用,<aop:advisor>在Spring 2.0中有自己的命名空间。格式如下:
1 <aop:config> 2 <aop:pointcut id="businessService" 3 expression="execution(* com.xyz.myapp.service.*.*(..))"/> 4 5 <aop:advisor 6 pointcut-ref="businessService" 7 advice-ref="tx-advice"/> 8 </aop:config> 9 10 <tx:advice id="tx-advice"> 11 <tx:attributes> 12 <tx:method name="*" propagation="REQUIRED"/> 13 </tx:attributes> 14 </tx:advice>就想使用 pointcut-ref 属性一样,你还可以使用 pointcut 属性来定义一个内联的切入点表达式。
你可以使用order属性来定义advice的先后顺序。
示例
让我们来看看在 Section 9.2.7, “Example”提过并发锁失败重试的例子,使用schema进行重写是什么效果。
由于并发问题(例如:死锁失败),业务逻辑服务层(business services)有时候会执行失败。 如果重新尝试一下,他下次执行可能就会成功。对于business services来说,失败后重试是很正常的(Idempotent操作不需要用户参与,否则会得出矛盾的结论) 我们可能需要透明的重试操作以避免让客户看见 PessimisticLockingFailureException 例外被抛出。 这就要求在一个跨域多各服务层进行操作,因此通过切面编程是很理想的实现。
因为我们想要进行重试操作,我们会需要使用到around advice,这样我们就可以多次调用proceed()方法来实现重试操作。 下面是简单的切面实现(一个schema支持的普通Java 类):
View Codepublic class ConcurrentOperationExecutor implements Ordered { private static final int DEFAULT_MAX_RETRIES = 2; private int maxRetries = DEFAULT_MAX_RETRIES; private int order = 1; public void setMaxRetries(int maxRetries) { this.maxRetries = maxRetries; } public int getOrder() { return this.order; } public void setOrder(int order) { this.order = order; } public Object doConcurrentOperation(ProceedingJoinPoint pjp) throws Throwable { int numAttempts = 0; PessimisticLockingFailureException lockFailureException; do { numAttempts++; try { return pjp.proceed(); } catch(PessimisticLockingFailureException ex) { lockFailureException = ex; } } while(numAttempts <= this.maxRetries); throw lockFailureException; } }