Какие аннотации показывают, что класс является Spring-бином?
Что проверяют
Понимаете ли вы, что бином класс делает не аннотация сама по себе, а регистрация в контейнере: через сканирование или явное объявление. Следом обычно спрашивают, чем @Service отличается от @Component и что особенного в @Repository и @Configuration.
Как отвечать
Стереотипные аннотации, которые находит @ComponentScan:
@Component: базовая, остальные стереотипы мета-аннотированы ею;@Service: технически тот же@Component, разница в смысле, это слой бизнес-логики. Помогает читаемости и служит удобной целью для pointcut в AOP, своего поведения не добавляет;@Repository: слой доступа к данным. Кроме маркировки включает трансляцию исключений:PersistenceExceptionTranslationPostProcessorпревращает исключения драйвера и JPA в иерархиюDataAccessException;@Controllerи@RestController: веб-слой, второй добавляет@ResponseBodyко всем методам;@Configuration: тоже компонент, но его методы@Beanпроксируются через CGLIB, и вызов одного@Bean-метода из другого возвращает тот же синглтон;@ControllerAdviceи@RestControllerAdvice: глобальная обработка ошибок, тоже бины.
Второй путь: метод с @Bean внутри конфигурации. Так регистрируют классы из сторонних библиотек, на которые аннотацию не повесить. Третий: интерфейсы репозиториев Spring Data, их реализации создаются автоматически без аннотаций на классе. Ещё сканер понимает @Named из jakarta.inject, если он есть в classpath.
Аннотации @Scope, @Lazy, @Primary, @Qualifier меняют поведение бина, но бином класс не делают.
Где спотыкаются
Называют @Autowired аннотацией бина. Она описывает точку внедрения, а не регистрирует класс.
Кладут класс с @Service вне сканируемого пакета. Аннотация есть, бина нет, и запуск падает с NoSuchBeanDefinitionException.
Объявляют @Bean-методы в классе с @Component вместо @Configuration. Это облегчённый режим без прокси: прямой вызов такого метода создаёт новый объект вместо синглтона.