AfterReturningAdvice是否在交易结束之前的之后开始



我使用的是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所说,最低订单值优先:

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

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

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

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

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

同样,用@Aspectbean定义的各个方面也可以用@Order注释进行进一步配置。

最新更新