В чём разница между @Component и специализированными аннотациями (@Service, @Repository)?

«В чём разница между @Component и специализированными аннотациями (@Service, @Repository)?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Все аннотации @Service, @Repository, @Controller являются специализациями @Component. На техническом уровне они идентичны — Spring регистрирует классы с этими аннотациями как бины. Разница — семантическая и иногда функциональная.

Аннотация Назначение Специфические особенности
@Component Универсальный компонент Базовая аннотация, без дополнительной семантики.
@Service Слой бизнес-логики Обозначает сервисный класс. Не добавляет особой функциональности, но улучшает читаемость кода.
@Repository Слой доступа к данным (DAO) Автоматически трансформирует исключения доступа к данным в Spring-специфичные DataAccessException. Помогает при использовании декларативных транзакций.
@Controller / @RestController Веб-слой (MVC) Обнаруживается механизмом @RequestMapping. @RestController = @Controller + @ResponseBody.

Практическое правило: Используйте специализированные аннотации, когда они соответствуют роли класса. Это делает архитектуру понятнее и может включать дополнительную функциональность фреймворка.