Ответ
@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 является идиоматичным и безопасным выбором.