У меня есть класс с несколькими методами. Некоторые из них являются публичными, а другие - нет. См. Пример ниже.Весенний @Transactional на уровне класса применяется к каким методам?
Какие методы будут выполняться в контексте транзакции? Только публичные?
Не удалось найти ответ в documentation.
@Transactionl
public class A {
public void pub() {...}
void pack() {...}
protected void prot() {...}
private void pri() {...}
}
Обычно у вас есть служебный интерфейс и функция транзакции реализована через прокси JDK. В этом случае проксируются (и, следовательно, транзакционные) только методы из интерфейса службы. Без сервисного интерфейса - ваш случай, я полагаю, класс A не имеет никаких инструментов - вам нужно перейти с параметром proxy-target-class в true, и я ожидаю, что каждый метод, который вам удастся вызвать из-за пределов транзакции, public, protected и package default. – Michal
[Это в документации] (http://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/htmlsingle/#aop-understanding-aop-proxies), просто не в разделе о '@ Transactional'. Как отметил Михал, '@ Transactional' работает, создавая прокси. Таким образом, только вызовы, проходящие через прокси, вызывают логику '@ Transactional'. Есть исключения из этого. Вы можете использовать время компиляции вместо прокси-серверов времени выполнения, чтобы получить '@ Transactional' по частным/защищенным методам. –
Ну, я ошибся с моим ожиданием. Фактически документы говорят об этом с формулировкой, довольно близкой к ответу Паулиуса Матулиониса. Поиск в документах для «Если вы делаете аннотацию защищенного, частного или« находит его в документах ». Я думаю, что это правильный ответ. – Michal