2017-09-28 150 views
0

首先让我们考虑一下我们有简单地完成工作的CustomerRegister服务。是否可以创建一个方法,该方法对@Transaction最初注释的方法提供了@AfterReturnin操作?

@Service 
class CustomerRegister { 
    private final CustomerRegister customerRegister; 

    CustomerRegister(CustomerRegister customerRegister) { 
     this.customerRegister = customerRegister; 
    } 

    @Transactional 
    public void create(Customer customer) { 
     customerRegister.persist(customer); 
    } 
} 

后来决定可以很好地拥有关于该注册表操作的业务度量标准。 常见的选择是使用org.springframework.boot.actuate.metrics.CounterService

需要注意的是:

使用@Transactional,春季动态创建(S)一个代理, 实现相同的接口作为类你标注

如果我们决定调用

counterService.increment(REGISTY_METRIC); 

在创建方法的范围内,那么计数器将会增加,即使在事务中是回滚。

我的想法是创建一个方面是包装了transactional proxy(其原包装服务CustomerRegister)。然后@Aspect组件可以提供用@AfterReturning(pointcut =注释的方法,即 增加公制计数器。

换句话说

  1. 如何实现在另一个方面方面?
  2. 如何在事务代理上实现方面?

回答

1

实现方面,因为它是正常完成。只要确保自定义方面'@Order被设置为低值(,即最高优先级,例如1),使得它在作为事务方面的任何其他方面之前执行。

请参阅下图(reference)以图形方式理解请求流程。通过在custom advisor(s)上设置适当的订单,可以在交易建议之前/之后运行,而无需特别考虑。

Spring Transaction execution flow

其他推荐阅读here理解方面的排序是如何在Spring处理。

相关问题