Какой метод вызывается после создания бина в Spring?

Ответ

После создания и внедрения зависимостей (dependency injection) бина в Spring вызывается его метод инициализации. Есть два основных способа его определить:

  1. Аннотация @PostConstruct (предпочтительный способ):

    import javax.annotation.PostConstruct;
    
    @Component
    public class DatabaseService {
        @PostConstruct
        public void init() {
            // Выполняется после инъекции всех зависимостей
            System.out.println("Bean is ready for use.");
            // Здесь обычно: загрузка кэша, проверка конфигурации, открытие соединений
        }
    }

    Почему предпочтительнее: Это стандарт JSR-250, который не привязывает ваш код к Spring API.

  2. Реализация интерфейса InitializingBean:

    import org.springframework.beans.factory.InitializingBean;
    
    @Component
    public class CacheManager implements InitializingBean {
        @Override
        public void afterPropertiesSet() throws Exception {
            // Аналогично @PostConstruct
            this.loadCache();
        }
    }

Порядок вызова: Конструктор -> Внедрение зависимостей (@Autowired) -> @PostConstruct / afterPropertiesSet().

Ответ 18+ 🔞

А, слушай, ну это ж классика, блядь! Ты создал свой бин, зависимости ему впендюрили, и что дальше? А дальше-то ему, сука, инициализироваться надо! Как человек утром кофе выпивает, чтобы в себя прийти.

Вот смотри, есть два главных способа этому бину сказать: «Проснись и пиздуй!», то есть выполнить стартовый код.

Первый способ — @PostConstruct (это типа золотой стандарт, его все любят):

import javax.annotation.PostConstruct;

@Component
public class DatabaseService {
    @PostConstruct
    public void init() {
        // Выполняется, когда все зависимости уже впихнули
        System.out.println("Bean is ready for use.");
        // Тут обычно: загрузка кэша, проверка конфигурации, открытие соединений
    }
}

Почему он такой всеми любимый, этот @PostConstruct? Да потому что он, блядь, от JSR-250, стандартный такой! Твой код не привязан к спрингу намертво, как будто сваркой прихвачен. Чистота, блядь, элегантность!

Второй способ — через интерфейс InitializingBean (более старый, спринговый):

import org.springframework.beans.factory.InitializingBean;

@Component
public class CacheManager implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        // Делает то же самое, что и @PostConstruct
        this.loadCache();
    }
}

Работает, конечно, но это уже прям признание в любви к Spring API. Как будто татуировку «I ♥ Spring» набил.

И главное, запомни порядок, ёпта, а то запутаешься:

  1. Конструктор — только родился, ещё нихуя не понимает.
  2. Внедрение зависимостей (@Autowired) — вот тебе, дружок, все твои поля, на, держи.
  3. @PostConstruct / afterPropertiesSet() — а вот теперь, сука, когда всё есть, можно и дела делать! Загрузить кэш, проверить конфиги, подключиться куда надо. Полный порядок, блядь!

Вот так вот, просто и без подвоха. Выбирай первый способ и живи спокойно.