#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
помощью аннотаций.