es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , , ,

Answer

  1. Avatar for 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étodo postProcessAfterInitialization.

    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ón Refreshable debe aplicarse a un método que devuelve un valor, de lo contrario, el parámetro returnValue será nulo.

    Referencia: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/BeanPostProcessor.html

Comments are closed.