Библиотека Java разработчика
10.1K subscribers
1.07K photos
603 videos
58 files
1.5K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
💡 Не делай этого в @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).

📲 Мы в MAX

👉@BookJava
👍5🔥2