Какую роль выполняет аннотация @Bean в Spring?

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

Ответ

Аннотация @Bean помечает метод, который создаёт и регистрирует один экземпляр бина (объекта) в контексте Spring IoC. Это основа Java-based конфигурации, альтернатива XML-объявлению бинов.

Основная цель: Дать разработчику полный контроль над процессом создания экземпляра бина, когда автоматическое сканирование через @Component невозможно или недостаточно.

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

@Configuration
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl("jdbc:postgresql://localhost/mydb");
        ds.setUsername("user");
        ds.setPassword("pass");
        return ds; // Возвращаемый объект будет управляться Spring-контейнером
    }

    @Bean
    @Lazy
    public SomeService service(DataSource dataSource) { // Внедрение зависимости
        return new SomeServiceImpl(dataSource);
    }
}

Ключевые аспекты:

  • Имя бина: По умолчанию совпадает с именем метода. Можно задать явно: @Bean("myDataSource").
  • Управление жизненным циклом: Spring вызывает аннотированные @Bean методы и управляет возвращёнными объектами (инъекция зависимостей, вызов @PostConstruct, @PreDestroy).
  • Область видимости (Scope): Может быть настроена с помощью @Scope("prototype").
  • Профили: Создание бина можно привязать к активному профилю с помощью @Profile("prod").

Отличие от @Component: @Bean используется в методах конфигурационных классов, @Component — на уровне классов для автоматического обнаружения.