Для чего в Spring используется аннотация @Bean над методом?

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

Ответ

Аннотация @Bean используется в классах, помеченных @Configuration, для явного объявления бина, который будет управляться Spring IoC-контейнером. Метод, помеченный @Bean, определяет логику создания и настройки экземпляра этого бина.

Базовый пример:

@Configuration
public class AppConfig {

    @Bean // Spring вызовет этот метод и зарегистрирует возвращаемый объект как бин
    public MyService myService() {
        return new MyServiceImpl(); // Произвольная логика создания
    }
}

Ключевые причины использования @Bean вместо стереотипных аннотаций (@Component):

  1. Интеграция стороннего кода: Когда нужно зарегистрировать в контейнере класс из библиотеки, исходный код которой вы не можете изменить (добавить @Component).
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(); // Создание бина для сторонней библиотеки
    }
  2. Сложная логика инициализации: Когда создание объекта требует дополнительной настройки, вызовов методов и т.д.
  3. Контроль над типом бина: Метод может объявить возвращаемый тип как интерфейс или абстрактный класс, скрывая конкретную реализацию.
  4. Внедрение зависимостей через параметры метода: Spring автоматически разрешит и внедрит зависимости, необходимые для создания бина.
    @Bean
    public OrderService orderService(OrderRepository repository, PaymentClient client) {
        return new OrderService(repository, client); // Зависимости внедряются автоматически
    }

Важное свойство: В контексте @Configuration Spring кэширует результат вызова @Bean-метода, гарантируя, что для каждого бина будет создан ровно один экземпляр (Singleton scope по умолчанию).