是否可以创建一个Aspect,它在最初使用@Transaction注释的方法上提供@AfterReturnin操作?

时间:2017-09-28 15:28:52

标签: java spring spring-aop spring-transactions

首先,我们可以考虑使用CustomerRegister服务来完成其工作。

@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,Spring动态创建一个代理   实现与您正在注释的类相同的接口

如果我们决定调用

counterService.increment(REGISTY_METRIC);

在create method的范围内,即使在事务回滚中,计数器也会增加。

我的想法是创建一个包含 transactional proxy (包装原始CustomerRegister服务)的方面。然后,@Aspect组件可以提供使用@AfterReturning(pointcut =注释的方法 增量度量计数器。

换句话说:

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

1 个答案:

答案 0 :(得分:1)

按正常方式实施方面。只需确保自定义方面' @Order设置为低值(,即最高优先级,例如1 ),以便在此情况下在事务方面的任何其他方面之前执行。

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

Spring Transaction execution flow

另外推荐阅读here以了解如何在Spring中处理方面排序。