【问题标题】:Is it possible to create an Aspect that provides @AfterReturnin operation on method that was originally annotated with @Transaction?是否可以在最初使用@Transaction 注释的方法上创建提供@AfterReturnin 操作的方面?
【发布时间】:2018-03-10 10:11:12
【问题描述】:

首先让我们考虑一下我们的 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方法的范围内,即使事务被回滚,计数器也会增加。

我的想法是创建一个包装 transactional proxy(包装原始 CustomerRegister 服务)的 aspect。然后 @Aspectcomponent 可以提供用 @AfterReturning(pointcut = 注释的方法 递增指标计数器。

换句话:

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

【问题讨论】:

    标签: java spring spring-aop spring-transactions


    【解决方案1】:

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

    请参阅下图 (reference) 以图形方式了解请求流程。通过在custom advisor(s) 上设置适当的顺序,它可以在事务通知之前/之后运行,无需任何特殊考虑。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2021-03-28
      • 2020-07-03
      相关资源
      最近更新 更多