Ответ
Аннотация @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 — на уровне классов для автоматического обнаружения.