Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.
Наука · 20 августа 2026 г.
💡 Не делай этого в @PostConstruct — особенно в проде — 20 августа 2026 г. в 06:18:22.303
💡 Не делай этого в @PostConstruct — особенно в проде Сейчас расскажу, почему инициализировать важную бизнес-логику в @PostConstruct — плохая идея. Типичный пример: @Component public class CacheLoader { private final SomeService service; public CacheLoader(SomeService service) { this.service = service; } @PostConstruct public void init() { service.loadDataIntoCache(); // ⚠️ обращение к БД } } 🧨 Проблема: @PostConstruct вызывается до того, как приложение полностью поднялось. Если внутри будет ошибка (например, БД недоступна) — приложение может упасть, или что хуже — запуститься в полурабочем состоянии. 📌 Кроме того: * ❌ Нет контроля над порядком выполнения таких методов; * ❌ Нельзя легко переиспользовать эту логику (например, вручную перезагрузить кеш); * ❌ В тестах или dev-среде — такие вызовы часто мешают. ✅ Современный подход — использовать ApplicationListener: @Component public class CacheLoader implements ApplicationListener<ApplicationReadyEvent> { private final SomeService service; @Override public void onApplicationEvent(ApplicationReadyEvent event) { service.loadDataIntoCache(); // 👍 вызывается только после старта } } 📌 Альтернатива — аннотация @EventListener: @EventListener(ApplicationReadyEvent.class) public void onReady() { // безопасно загружаем данные } 📦 В Spring Boot это нативный и рекомендованный способ выполнения кода после старта. 🧠 Резюме: 🔹 @PostConstruct — только для простой инициализации бинов. 🔹 Бизнес-логику и I/O — в @EventListener(ApplicationReadyEvent.class). 👉 @BookJava

