欢迎转载交流: 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 类):

public 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;
   }

}
View Code

相关文章:

  • 2021-09-07
  • 2021-12-27
  • 2021-09-26
  • 2019-11-03
  • 2021-08-13
  • 2022-12-23
  • 2021-08-09
  • 2019-03-09
猜你喜欢
  • 2021-07-25
  • 2021-10-03
  • 2021-06-18
  • 2021-06-25
  • 2021-12-19
  • 2021-08-17
  • 2022-12-23
相关资源
相似解决方案