Ответ
Аннотация @Bean в Spring используется для явного объявления метода, который создает, конфигурирует и инициализирует объект, управляемый контейнером IoC (ApplicationContext). Возвращаемый объект регистрируется как Spring-бин.
Основные сценарии использования:
- Интеграция сторонних библиотек: Когда класс из внешней библиотеки не помечен аннотациями Spring (
@Component,@Serviceи т.д.). - Сложная конфигурация: Когда создание бина требует нетривиальной логики (например, условное создание, настройка свойств).
- Определение бинов в
@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) и кэширует результат.