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