Какими способами бины (beans) попадают под управление контейнера Spring?

«Какими способами бины (beans) попадают под управление контейнера Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring IoC-контейнер управляет объектами, которые называются бинами. Бин попадает в контекст приложения одним из следующих способов:

1. Автоматическое сканирование компонентов (Component Scanning)

Наиболее распространенный способ. Классы помечаются стереотипными аннотациями, а Spring сканирует указанные пакеты и регистрирует их как бины.

  • @Component — общая аннотация для любого компонента.
  • @Service — для классов бизнес-логики.
  • @Repository — для классов доступа к данным (DAO).
  • @Controller / @RestController — для веб-контроллеров.
@Service // Spring создаст и будет управлять экземпляром этого класса
public class UserService {
    // ...
}

Сканирование активируется аннотацией @ComponentScan в классе конфигурации.

2. Явное объявление в конфигурации Java

Используется, когда нужно сконфигурировать бин, класс которого находится вне вашего контроля (например, из сторонней библиотеки), или требуется сложная логика инициализации.

@Configuration
public class AppConfig {
    @Bean // Метод возвращает объект, который Spring регистрирует как бин
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

3. Конфигурация через XML (устаревший, но поддерживаемый способ)

<bean id="myBean" class="com.example.MyBeanClass"/>

Что происходит дальше? После регистрации Spring берет на себя полный жизненный цикл бина: создание экземпляра, внедрение зависимостей (DI), вызов методов инициализации/уничтожения (при наличии), управление областью видимости (scope).