Начинается ли AfterReturningAdvice после того, как транзакция была закрыта?

#java #spring #proxy #spring-aop #spring-transactions

Вопрос:

Я использую 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;
    }

}
 

Он работает нормально, поэтому я мог бы предположить, что он работает точно после транзакции, но я не уверен.
Есть ли какое-нибудь место в документации или что-то еще, где я могу найти эту информацию?

Ответ №1:

Помните, что транзакция весной также реализована как аспект, и совет по транзакции имеет определенный порядок по умолчанию 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"/>

Те же ваши индивидуальные аспекты, определенные с @Aspect помощью компонентов, могут быть дополнительно настроены с @Order помощью аннотаций.