【问题标题】:Does AfterReturningAdvice start after of before Transaction closed?AfterReturningAdvice 是否在事务关闭之前或之后开始?
【发布时间】:2022-01-08 01:57:36
【问题描述】:

我正在使用 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;
    }

}

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

【问题讨论】:

    标签: java spring proxy spring-aop spring-transactions


    【解决方案1】:

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

    实际的order 可以解释为优先级,第一个对象(具有最低顺序值)具有最高优先级。

    由于Ordered.HIGHEST_PRECEDENCE 返回代表最高优先级的Integer.MIN_VALUE,因此顺序可能有点混乱。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 2014-09-06
      相关资源
      最近更新 更多