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
注释进一步配置。
我正在使用 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
注释进一步配置。