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

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

Ответ

Аннотация @Bean в Spring используется для явного объявления метода, который создает, конфигурирует и инициализирует объект, управляемый контейнером IoC (ApplicationContext). Возвращаемый объект регистрируется как Spring-бин.

Основные сценарии использования:

  1. Интеграция сторонних библиотек: Когда класс из внешней библиотеки не помечен аннотациями Spring (@Component, @Service и т.д.).
  2. Сложная конфигурация: Когда создание бина требует нетривиальной логики (например, условное создание, настройка свойств).
  3. Определение бинов в @Configuration классах: Явный и централизованный способ конфигурации.

Пример объявления бина:

@Configuration
public class AppConfig {
    // Метод создает и возвращает бин типа DataSource
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setUrl("jdbc:h2:mem:testdb");
        ds.setUsername("sa");
        ds.setPassword("");
        return ds;
    }

    // Бин может зависеть от другого бина через параметр метода
    @Bean
    public MyService myService(DataSource dataSource) {
        return new MyService(dataSource);
    }
}

Ключевые особенности:

  • Имя бина по умолчанию совпадает с именем метода (dataSource, myService). Его можно изменить с помощью @Bean("customName").
  • На метод @Bean можно добавлять другие аннотации для управления жизненным циклом: @Scope, @Lazy, @Primary, @Profile.
  • Контейнер Spring вызывает метод @Bean только один раз (для singleton scope) и кэширует результат.