В чем разница между аннотациями @Repository, @Service и @Controller в Spring?

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

Ответ

Все три аннотации являются специализациями @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 применять к ним специфические аспекты.