Эти аннотации Spring Framework используются для маркировки классов как Spring Beans, управляемых контейнером. Они являются специализированными формами @Component и предназначены для улучшения семантики и удобства использования.
@Component: Универсальная аннотация, указывающая, что класс является компонентом Spring и должен быть обнаружен при сканировании компонентов. От нее произошли остальные специализированные аннотации.
@Repository: Используется для классов, взаимодействующих с источниками данных (DAO, репозитории). Она добавляет функциональность обработки исключений, специфичную для доступа к данным (например, перевод специфичных для JPA исключений в Spring DataAccessException).
@Service: Используется для классов, содержащих бизнес-логику. Семантически указывает на слой сервиса. Применяется для классов, которые координируют взаимодействие между компонентами уровня представления и уровня данных.
@Controller: Используется для классов, обрабатывающих веб-запросы и возвращающих ответы. Применяется в веб-слое MVC для обработки входящих HTTP-запросов.
| Аннотация | Назначение | Слой приложения | Дополнительные возможности (по сравнению с @Component) |
|---|---|---|---|
@Component | Общий Spring Bean | Любой | Нет |
@Repository | Доступ к данным | Уровень данных | Преобразование исключений доступа к данным |
@Service | Бизнес-логика | Сервисный уровень | Нет (семантическое назначение) |
@Controller | Обработка веб-запросов | Уровень представления | Обработка HTTP-запросов, маппинг URI |
Все эти аннотации, по сути, приводят к созданию Spring Bean, но @Repository и @Controller предоставляют дополнительные возможности, специфичные для их предполагаемого использования. @Service в первую очередь является семантической аннотацией.