Ответ
Все три аннотации являются специализациями @Component и регистрируют класс как bean в контексте Spring. Их основное различие — семантическое, для обозначения слоя архитектуры приложения и включения специфического поведения.
| Аннотация | Слой | Назначение и особенности |
|---|---|---|
@Repository |
Слой доступа к данным (DAO) | 1. Помечает класс как репозиторий. 2. Автоматически транслирует исключения конкретных поставщиков данных (например, JDBC SQLException) в непроверяемые исключения Spring DataAccessException. |
@Service |
Слой бизнес-логики | 1. Помечает класс как сервис, содержащий бизнес-логику. 2. Не имеет дополнительной технической функциональности по умолчанию, но используется для четкого разделения ответственности. Часто является точкой для применения транзакций (@Transactional). |
@Controller |
Слой представления (веб) | 1. Помечает класс как контроллер Spring MVC. 2. Позволяет автоматическое обнаружение методов, обрабатывающих HTTP-запросы (в сочетании с @RequestMapping и др.). 3. Используется для возврата представлений (View). @RestController — это специализация для REST API, которая добавляет @ResponseBody на уровне класса. |
Примеры:
// Слой данных
@Repository
public class JpaUserRepository implements UserRepository {
@PersistenceContext
private EntityManager em;
// ... методы доступа к данным
}
// Слой бизнес-логики
@Service
public class UserService {
@Transactional
public User createUser(UserDto dto) { ... }
}
// Веб-слой
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping
public String listUsers(Model model) { ... }
}
Использование правильных стереотипных аннотаций улучшает читаемость кода и позволяет Spring применять к ним специфические аспекты.