TGViewer
Java Geek Java Geek @java_geek · 2.37K subscribers
Post #370 1.08K
🧠 Проблема ленивой инициализации @Transactional-сервисов в Spring Boot

Когда вы используете @Transactional на методе сервиса, Spring оборачивает бин в прокси. Но если вы решите сделать ленивую инициализацию (@Lazy) или внедрите такой бин в другой с помощью ObjectProvider.getIfAvailable() или @Autowired(required = false) — есть риск неожиданного поведения.

📌 Типичный баг:


@Service
@Lazy
public class MyService {

@Transactional
public void doSomething() {
// ...
}
}


🔍 Если где-то в коде вызвать applicationContext.getBean(MyService.class) в момент, когда прокси ещё не создан — вы получите оригинальный, не-прокси-объект. А значит, @Transactional не сработает.

⚠️ В результате — метод выполнится без транзакции, и вы не поймёте почему.

💡 Как избежать:

* Никогда не используйте @Lazy или ленивое получение @Transactional-сервисов, если не понимаете нюансов проксирования.
* Лучше разделите логику: сервис без прокси — отдельно, бизнес-методы с @Transactional — в другом бине.

✅ Надёжный способ: вызывать @Transactional-методы только через Spring-контейнер. Даже внутри самого сервиса — через self-injection:


@Service
public class MyService {

private final MyService self;

public MyService(@Lazy MyService self) {
this.self = self;
}

public void doWrapper() {
self.doTransactional(); // прокси работает
}

@Transactional
public void doTransactional() {
// ...
}
}


👉 @java_geek
  • ❤ 4
  • 👍 2
  • 👎 1
  • 👏 1
More from @java_geek
  1. Sep 24, 2026Что такое стек-трейс? Стек-трейс (stack trace) представляет собой список вызовов методов в…
  2. Sep 17, 2026Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)? Д…
  3. Sep 15, 2026Array vs ArrayList Выбор между Array (стандартным Java-массивом) и ArrayList зависит от сп…
  4. Sep 11, 2026Какова цель ключевого слова final, когда оно используется с переменной? Ключевое слово fin…
  5. Sep 9, 2026☕ Java Tip: Как работает var в Java С версии Java 10 появился ключевое слово var. Оно упро…
  6. Sep 7, 2026Что такое перегрузка методов в Java? Перегрузка методов — это мощный приём, который позвол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →