В каких случаях в Spring удобнее использовать @Configuration, а не @Component?

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

Ответ

@Configuration — это специализированная форма @Component, предназначенная для декларативного определения бинов. Её основное преимущество — полная поддержка режима проксирования (CGLIB), что гарантирует, что вызов одного @Bean-метода из другого внутри того же класса конфигурации всегда возвращает один и тот же singleton-бин (т.е. предотвращает случайное создание нескольких экземпляров).

Используйте @Configuration, когда:

  • Нужно определить инфраструктурные бины (DataSource, JPA EntityManagerFactory, etc.).
  • Создаваемые бины имеют сложные зависимости, требующие вызова других @Bean-методов.
  • Требуется использование Spring-специфичной логики (например, @Profile, @Conditional) при объявлении бинов.

Пример (безопасный вызов бинов внутри конфигурации):

@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
    // Spring гарантирует, что dataSource() будет вызван только один раз,
    // даже если он вызывается из другого метода.
    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource()); // Возвращается проксированный singleton
    }
}

**Используйте @Component (или стереотипные аннотации) для обычных бизнес- или сервисных бинов. Для простых случаев объявления бинов без взаимных вызовов можно использовать @Component с @Bean-методами, но @Configuration является идиоматичным и безопасным выбором.