Какими способами Spring определяет класс как бин?

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

Ответ

Spring IoC-контейнер регистрирует класс как управляемый бин (Bean) несколькими способами:

1. Аннотации стереотипов (Component Scanning) При включенном сканировании (@ComponentScan) Spring автоматически обнаруживает и регистрирует классы, помеченные:

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

2. Явное объявление через Java-конфигурацию (@Bean) В классе, помеченном @Configuration, методы с аннотацией @Bean определяют бины. Имя бина по умолчанию — имя метода.

@Configuration
public class AppConfig {
    @Bean // Создаст и зарегистрирует бин с именем 'dataSource'
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

3. XML-конфигурация (устаревший способ)

<bean id="userService" class="com.example.UserService"/>

Ключевой принцип: Независимо от способа объявления, все бины управляются контейнером Spring, который контролирует их жизненный цикл (создание, внедрение зависимостей, уничтожение). По умолчанию область видимости (scope) бина — singleton.