Что делает аннотация @PostConstruct в Spring?

Ответ

@PostConstruct — это аннотация JSR-250 (Java Common Annotations), которая помечает метод, выполняемый после внедрения зависимостей (DI) и перед готовностью бина к использованию.

Основное назначение:

  • Инициализация ресурсов (кэшей, подключений).
  • Валидация конфигурации бина.
  • Выполнение предварительных вычислений.

Ключевые правила:

  • Метод должен быть void и не принимать параметров.
  • Вызывается только один раз за жизненный цикл бина.
  • Является альтернативой интерфейсу InitializingBean или атрибуту init-method в XML.

Пример использования:

@Service
public class CacheService {
    private Map<String, Object> cache;

    @PostConstruct
    public void initCache() {
        this.cache = new ConcurrentHashMap<>();
        // Предзагрузка данных в кэш
        cache.put("config", loadConfiguration());
    }
}

Важно: Метод @PostConstruct гарантированно выполняется после полного завершения инъекции всех зависимостей (@Autowired, @Inject).

Ответ 18+ 🔞

А, слушай, смотри, вот эта аннотация @PostConstruct — это ж как тот самый сигнал, типа «всё, я уже собран, зависимости мне воткнули, сейчас можно и дела поделать». Ну, типа JSR-250, стандартная такая штука в Java.

Зачем она вообще, эта сука, нужна? Ну, например, ты создал сервис, там кэш какой-нибудь, или подключение к базе. Так вот, @PostConstruct — это момент, когда тебе говорят: «Чувак, все твои @Autowired поля уже проинициализированы, можешь спокойно начинать ебашить свою логику инициализации». То есть:

  • Поднять кэш, загрузить туда данные.
  • Проверить, что конфигурация не кривая — а то потом пиздец будет.
  • Ну или просто какие-то тяжёлые вычисления один раз сделать, чтобы потом не тратить время.

А теперь правила, блядь, их надо соблюдать, а то нихуя не заработает:

  • Метод должен быть void и без параметров. Вообще нихуя не должен возвращать и нихуя не принимать. Просто сделал дело — и гуляй.
  • Вызовется он ровно один раз за жизнь бина. Не два, не три — один, как отмеряно.
  • Это типа цивилизованная замена этому уродскому InitializingBean или этим XML-ным init-method. Ну, современнее, короче.

Смотри, как это выглядит на практике:

@Service
public class CacheService {
    private Map<String, Object> cache; // Пока тут null, блядь

    @PostConstruct
    public void initCache() {
        this.cache = new ConcurrentHashMap<>(); // А вот теперь создаём
        // И сразу хуячим туда данные, чтобы всё было готово
        cache.put("config", loadConfiguration());
    }
}

И главное, на что обратить внимание, ёпта: Метод с @PostConstruct гарантированно вызовется после того, как Spring воткнёт все зависимости через @Autowired или @Inject. То есть не будет такого, что ты полез в кэш, а он ещё null, потому что поле someRepository не проинициализировано. Всё чётко, по расписанию. Как поезд, блядь.