Встречается на 31% собеседований по Java

Что такое bean

Bean в контексте Spring — это объект, жизненным циклом которого управляет контейнер Spring IoC (Inversion of Control). Контейнер создает, инициализирует, связывает и уничтожает бины, а также внедряет зависимости между ними. Бины являются основными строительными блоками приложения на Spring: это могут быть контроллеры, сервисы, репозитории, компоненты доступа к данным, конфигурационные классы и другие объекты, которые образуют логику приложения.

Как объявляются бины

Самый распространенный способ — использовать стереотипные аннотации на классах. Spring автоматически сканирует пакеты и регистрирует аннотированные классы как бины.

  • @Component — универсальная аннотация для любого Spring-компонента.
  • @Service — для сервисного слоя (бизнес-логика).
  • @Repository — для слоя доступа к данным (DAO).
  • @Controller — для веб-контроллеров (MVC).

Пример бина, объявленного через @Service:

java
@Service
public class MyService {
    public String sayHello() {
        return "Hello, Spring!";
    }
}

После запуска контекста Spring обнаружит MyService и создаст его экземпляр. Этот экземпляр можно внедрять в другие бины через конструктор, сеттер или поле.

Также бины можно объявлять явно:

  • В XML-конфигурации с помощью элемента <bean>.
  • В Java-конфигурации с помощью аннотации @Bean на методах конфигурационного класса.

Внедрение зависимостей

Контейнер Spring автоматически внедряет зависимости в бины. Это уменьшает связанность между компонентами и упрощает тестирование: вместо ручного создания зависимостей вы просто объявляете их, а Spring заботится об остальном.

java
@Service
public class OrderService {
    private final PaymentService paymentService;

    // Внедрение через конструктор — рекомендуемый способ
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

Здесь PaymentService будет автоматически найден и передан в конструктор OrderService.

Жизненный цикл бина

Spring управляет полным жизненным циклом бина: создание, инициализация, использование и уничтожение. Можно настроить поведение на каждом этапе с помощью аннотаций @PostConstruct (после инициализации) и @PreDestroy (перед уничтожением). Также можно реализовать интерфейсы InitializingBean и DisposableBean.

java
@Component
public class MyBean {
    @PostConstruct
    public void init() {
        // логика после создания и внедрения зависимостей
    }

    @PreDestroy
    public void cleanup() {
        // логика перед уничтожением бина
    }
}

Подводные камни

  • Скоуп бинов: по умолчанию бины — синглтоны (один экземпляр на контейнер). Для других скоупов используйте @Scope (например, prototype — новый экземпляр при каждом запросе).
  • Циклические зависимости: если два бина ссылаются друг на друга, Spring может не разрешить их. Решение — рефакторинг или использование @Lazy.
  • Сканирование пакетов: убедитесь, что аннотированные классы находятся в пакетах, которые сканирует Spring (обычно это пакет, где расположен класс с @SpringBootApplication).

Коротко

  • Bean — это объект, управляемый Spring IoC-контейнером.
  • Объявляется через аннотации (@Component, @Service, @Repository, @Controller) или явно в XML/Java-конфигурации.
  • Контейнер автоматически внедряет зависимости, что снижает связанность и упрощает тестирование.
  • Жизненный цикл бина управляется контейнером: можно задать логику инициализации и уничтожения.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы