Ответ
Spring предоставляет несколько аннотаций для объявления бинов, которые затем управляются ApplicationContext. Выбор зависит от роли компонента.
1. Стереотипные аннотации (Stereotype Annotations):
При сканировании компонентов (@ComponentScan) Spring автоматически регистрирует классы, помеченные этими аннотациями, как бины.
@Component: Базовая аннотация для любого бина.@Service: Специализация@Componentдля бизнес-логики сервисного слоя.@Repository: Специализация для слоя доступа к данным (DAO). Добавляет трансляцию исключений JDBC вDataAccessException.@Controller/@RestController: Для классов веб-уровня (MVC контроллеры).
2. Ручное определение бинов в Java-конфигурации:
Когда требуется больший контроль над созданием бина (например, инстанцирование стороннего класса), используется комбинация @Configuration и @Bean.
Пример конфигурации с @Bean:
@Configuration // Указывает, что класс содержит определения бинов
public class AppConfig {
// Метод, аннотированный @Bean, возвращает объект, который Spring помещает в контекст
@Bean
public MyService myService() {
// Здесь может быть сложная логика создания экземпляра
return new MyServiceImpl();
}
@Bean
public DataSource dataSource() {
// Создание и настройка бина DataSource
return new HikariDataSource();
}
}
Почему @Bean? Он позволяет определять бины программно, что полезно для настройки инфраструктурных компонентов, которые не являются частью вашего кода (сторонние библиотеки).