AfterReturningAdvice 是在事务关闭之前还是之后开始?

Does AfterReturningAdvice start after of before Transaction closed?

我正在使用 BeanPostProcessor,它在我的 Service 方法完成后执行一些代码。 但是我的 Service 也是 @Transactional

在那些方法中,这个“触发器”是在事务结束之后还是之前执行的?

@Component
public class MethodBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (findAnnotation(bean.getClass(), Service.class) != null) {
            var factory = new ProxyFactory(bean);
            factory.setProxyTargetClass(true);
            factory.addAdvice((AfterReturningAdvice) (returnValue, method, args, target) -> {
                if (method.isAnnotationPresent(Refreshable.class)) {
                    var refreshableDto = (RefreshableDto) returnValue;
                    if (refreshableDto != null) {
                        refreshableDto.copyId();
                    }
                }
            });
            factory.setExposeProxy(true);
            return factory.getProxy();
        }
        return bean;
    }

}

它工作正常,所以我可以假设它在交易后完全正常工作,但我不确定。 文档中有什么地方可以找到该信息吗?

请记住 Spring 中的事务也是作为一个方面实现的,并且事务建议具有定义的默认顺序 Ordered.LOWEST_PRECEDENCE。正如 Ordered 的 JavaDoc 所说,最低阶值首先出现:

The actual order can be interpreted as prioritization, with the first object (with the lowest order value) having the highest priority.

顺序可能有点混乱,因为 Ordered.HIGHEST_PRECEDENCE returns Integer.MIN_VALUE 表示最高优先级。

关于定义的默认顺序的信息可以在图中找到Table 2. 1.4.6. Using @Transactional章的注解驱动事务设置(参考文档5.3.x版本,其他版本章节可能不同,但原理是一样的。

您可以通过两种方式更改事务性 AOP 建议的顺序:

  • 注释驱动配置:@EnableTransactionManagement(order = 123)
  • XML驱动配置:<tx:annotation-driven order="123"/>

您使用 @Aspect bean 定义的各个方面可以使用 @Order 注释进一步配置。