Ответ
Аннотация @Bean используется в классах, помеченных @Configuration, для явного объявления бина, который будет управляться Spring IoC-контейнером. Метод, помеченный @Bean, определяет логику создания и настройки экземпляра этого бина.
Базовый пример:
@Configuration
public class AppConfig {
@Bean // Spring вызовет этот метод и зарегистрирует возвращаемый объект как бин
public MyService myService() {
return new MyServiceImpl(); // Произвольная логика создания
}
}
Ключевые причины использования @Bean вместо стереотипных аннотаций (@Component):
- Интеграция стороннего кода: Когда нужно зарегистрировать в контейнере класс из библиотеки, исходный код которой вы не можете изменить (добавить
@Component).@Bean public DataSource dataSource() { return new HikariDataSource(); // Создание бина для сторонней библиотеки } - Сложная логика инициализации: Когда создание объекта требует дополнительной настройки, вызовов методов и т.д.
- Контроль над типом бина: Метод может объявить возвращаемый тип как интерфейс или абстрактный класс, скрывая конкретную реализацию.
- Внедрение зависимостей через параметры метода: Spring автоматически разрешит и внедрит зависимости, необходимые для создания бина.
@Bean public OrderService orderService(OrderRepository repository, PaymentClient client) { return new OrderService(repository, client); // Зависимости внедряются автоматически }
Важное свойство: В контексте @Configuration Spring кэширует результат вызова @Bean-метода, гарантируя, что для каждого бина будет создан ровно один экземпляр (Singleton scope по умолчанию).