Всегда ли для конфигурации Spring-контекста требуется аннотация @Configuration?

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

Ответ

Нет, аннотация @Configuration не является единственным способом конфигурации Spring. Доступны альтернативные подходы:

  1. Компонентное сканирование и стереотипные аннотации (@Component, @Service, @Repository). Подходит для простого объявления бинов.
  2. Декларативная XML-конфигурация.
  3. Java-конфигурация без @Configuration. Можно размещать методы с @Bean внутри обычного класса, но это имеет ключевое ограничение:
    • Отсутствие проксирования (CGLIB): вызовы между @Bean-методами будут обычными вызовами Java, что может привести к созданию нескольких независимых экземпляров (нарушение семантики синглтона в контексте).

Пример проблемного кода без @Configuration:

public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource();
    }

    @Bean 
    public JdbcTemplate jdbcTemplate() {
        // Вызов dataSource() создаст НОВЫЙ экземпляр, а не вернет бин из контекста.
        return new JdbcTemplate(dataSource());
    }
}

Рекомендация: Для полноценной Java-конфигурации, где требуется взаимодействие между бинами, всегда используйте @Configuration. Она обеспечивает проксирование, гарантирующее, что вызовы @Bean-методов возвращают бины из контекста Spring.