В каких случаях требуется явное (ручное) объявление бина в Spring?

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

Ответ

Явное объявление бина в @Configuration классе необходимо, когда автоматического сканирования (@ComponentScan) недостаточно. Основные сценарии:

  1. Интеграция сторонних библиотек: Классы, исходный код которых нельзя аннотировать @Component.
  2. Кастомизация инстанса: Требуется тонкая настройка бина (параметры конструктора, свойства) перед внедрением в контекст.
  3. Условное создание: Бин должен создаваться только при определенных условиях (профиль, наличие свойства).

Пример конфигурации:

@Configuration
public class AppConfig {
    // 1. Кастомная настройка пула соединений
    @Bean
    public DataSource dataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl("jdbc:h2:mem:test");
        ds.setMaximumPoolSize(10);
        return ds;
    }
    // 2. Условный бин для prod-среды
    @Bean
    @Profile("prod")
    public Service prodService() {
        return new ProdService();
    }
}

Явная конфигурация дает полный контроль, но увеличивает объем кода. Оптимально — гибридный подход.