Конечно нет. Вам придется копипастить эти декораторы для каждого сервиса который вы хотите обернуть в транзакцию. Можно сделать примерно так:
public interface TransactionalOperation {
void doOperation();
}
public class TransactionalHandler {
@Autowired
private SessionProvider sessionProvider;
void doTransaction(TransactionalOperation transactionalOperation) {
// Create transaction
transactionalOperation.doOperation();
// Commit and roolback handler
}
}
public class SomeService {
@Autowired
private TransactionalHandler transactionalHandler;
public void doMake() {
transactionalHandler.doTransaction(() -> {
// Do something in transaction
});
}
}
Интерфейс TransactionalOperation можно заменить на любой функциональный интерфейс Java8 с другими параметрами по своему желанию и потребностям. Таким образом класс TransactionalHandler инкапсулирует логику обработки транзакций и принимает на вход лямбду с вашей бизнес логикой. Такой подход можно использовать в любых сервисах по мере надобности без копипаста ненужного кода.