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

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

Ответ

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

Основное применение:

  • Конфигурация бинов, когда исходный код класса нельзя изменить (например, классы из сторонних библиотек).
  • Тонкая настройка бина перед его внедрением.

Пример в классе конфигурации:

@Configuration
public class AppConfig {

    // Объявляем бин с именем "myService" (по умолчанию — имя метода)
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    // Бин с явным указанием имени и зависимостью от другого бина
    @Bean("dataSource")
    public DataSource dataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl("jdbc:h2:mem:testdb");
        return ds;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        // Spring автоматически внедрит DataSource, объявленный выше
        return new JdbcTemplate(dataSource);
    }
}

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

  • Методы с @Bean должны находиться в классах, аннотированных @Configuration (реже @Component).
  • Spring вызывает такой метод один раз, кэшируя результат, если не указана другая область видимости (например, @Scope("prototype")).
  • Зависимости между бинами можно указывать через параметры метода.
  • Позволяет использовать условное создание бинов с помощью аннотаций @Conditional.