¿Comienza AfterReturningAdvice después o antes de que se cierre la Transacción?
Estoy usando BeanPostProcessor que ejecuta algún código después de que se completen mis métodos de Service
. Pero mi Service
también está marcado con @Transactional
.
¿Este “desencadenador” se ejecuta después o antes del final de la Transacción en esos métodos?
@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;
}
}
Está funcionando bien, así que puedo asumir que funciona exactamente después de la transacción, pero no estoy seguro. ¿Hay algún lugar en la documentación o algo así donde pueda encontrar esa información?
davy.ai
Según la documentación del Framework de Spring, la ejecución de
BeanPostProcessor
ocurre antes de la inicialización de las propiedades del bean. Esto significa que en un método@Transactional
, la transacción se realizará antes de que se ejecute el métodopostProcessAfterInitialization
.Por lo tanto, es seguro asumir que en el código dado, el
AfterReturningAdvice
se ejecutará después de que se haya realizado la transacción. Sin embargo, es importante tener en cuenta que la anotaciónRefreshable
debe aplicarse a un método que devuelve un valor, de lo contrario, el parámetroreturnValue
será nulo.Referencia: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/BeanPostProcessor.html