Ответ
Контроллер в Spring MVC вызывает сервисный слой для выполнения бизнес-логики, а затем подготавливает данные для представления (View).
Почему так? Это следует принципу разделения ответственности (Single Responsibility Principle). Контроллер отвечает только за обработку HTTP-запроса и формирование ответа, делегируя логику приложения сервисам.
Пример для MVC (возврат представления):
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id, Model model) {
// 1. Вызов сервиса для получения данных
User user = userService.findById(id);
// 2. Передача данных в модель для представления
model.addAttribute("user", user);
// 3. Возврат имени view-шаблона
return "userProfile";
}
}
Пример для REST API (возврат DTO/JSON):
@RestController
public class UserApiController {
@Autowired
private UserService userService;
@GetMapping("/api/users/{id}")
public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
User user = userService.findById(id);
// Конвертация в DTO и возврат
return ResponseEntity.ok(new UserDto(user));
}
}
Ключевые моменты:
- Контроллер не должен содержать бизнес-логику.
- Зависимости (сервисы) внедряются через
@Autowiredили конструктор. - Для MVC данные передаются в объект
Model. - Результатом может быть имя view-шаблона (MVC) или непосредственно данные (REST).