← Назад к вопросам

Какие знаешь аннотация для создания контроллера?

1.7 Middle🔥 151 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Аннотации для создания контроллера в Spring

В Spring Framework существует несколько аннотаций для создания контроллеров. Выбор зависит от типа приложения и требуемого функционала. Рассмотрю основные и их отличия.

1. @Controller — базовая аннотация

Это классическая аннотация для веб-контроллеров, которые возвращают представления (Views):

@Controller
@RequestMapping("/users")
public class UserController {
    
    @GetMapping("/list")
    public String listUsers(Model model) {
        List<User> users = userService.getAllUsers();
        model.addAttribute("users", users);
        return "users/list"; // Имя шаблона
    }
    
    @GetMapping("/{id}")
    public String showUser(@PathVariable Long id, Model model) {
        User user = userService.getUserById(id);
        model.addAttribute("user", user);
        return "users/detail";
    }
}

Особенности: Возвращает логическое имя представления (String, View). Spring ищет соответствующий шаблон (JSP, Thymeleaf и т.д.). Требует ViewResolver для разрешения имён представлений.

2. @RestController — для REST API

Специализированная аннотация для создания REST контроллеров, которые возвращают JSON/XML данные:

@RestController
@RequestMapping("/api/v1/users")
public class UserRestController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping
    public List<UserDTO> getAllUsers() {
        return userService.getAllUsersAsDTO();
    }
    
    @GetMapping("/{id}")
    public UserDTO getUserById(@PathVariable UUID id) {
        return userService.getUserDTOById(id);
    }
    
    @PostMapping
    public ResponseEntity<UserDTO> createUser(@RequestBody CreateUserRequest request) {
        UserDTO created = userService.create(request);
        return ResponseEntity.status(HttpStatus.CREATED).body(created);
    }
    
    @PutMapping("/{id}")
    public UserDTO updateUser(@PathVariable UUID id, @RequestBody UpdateUserRequest request) {
        return userService.update(id, request);
    }
    
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable UUID id) {
        userService.delete(id);
        return ResponseEntity.noContent().build();
    }
}

Особенности: Автоматически сериализует объекты в JSON/XML. Возвращаемые объекты преобразуются в тело ответа. Не нужен ViewResolver. Эквивалентен @Controller + @ResponseBody на методах.

3. @Repository — для доступа к данным

Хотя это не контроллер, часто путают. Используется для слоя доступа к данным:

@Repository
public class UserRepository extends JpaRepository<User, UUID> {
    User findByEmail(String email);
    List<User> findByStatusAndCreatedDateAfter(UserStatus status, LocalDateTime date);
}

4. @Service — для бизнес-логики

Также не контроллер, но важен для архитектуры:

@Service
@Transactional
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    public UserDTO getUserDTOById(UUID id) {
        User user = userRepository.findById(id)
            .orElseThrow(() -> new EntityNotFoundException("User not found"));
        return convertToDTO(user);
    }
}

5. @Component — универсальная аннотация

Базовая аннотация Spring, которая может использоваться для любого bean'а:

@Component
public class CustomController {
    @RequestMapping("/custom")
    public String handle() {
        return "response";
    }
}

Отличия между аннотациями

@Controller — Возвращает View/String (имя шаблона) для MVC приложений с HTML.

@RestController — Возвращает JSON/XML объекты для REST API и микросервисов.

@Repository — Слой доступа к БД, возвращает сущности/коллекции.

@Service — Бизнес-логика, возвращает любые значения.

@Component — Общий компонент, редко для контроллеров.

Комбинированный пример архитектуры

@RestController
@RequestMapping("/api/v1/products")
public class ProductController {
    @Autowired
    private ProductService productService;
    
    @GetMapping("/{id}")
    public ProductDTO getProduct(@PathVariable UUID id) {
        return productService.getProductDTO(id);
    }
}

@Service
@Transactional
public class ProductService {
    @Autowired
    private ProductRepository productRepository;
    
    public ProductDTO getProductDTO(UUID id) {
        Product product = productRepository.findById(id)
            .orElseThrow(() -> new NotFoundException("Product not found"));
        return convertToDTO(product);
    }
}

@Repository
public class ProductRepository extends JpaRepository<Product, UUID> {
    Product findByCode(String code);
}

Рекомендации

Используй @Controller когда нужно возвращать HTML страницы. Используй @RestController когда разрабатываешь REST API. Всегда используй @Service для бизнес-логики. Используй @Repository для взаимодействия с БД. @Component редко нужен для контроллеров.

В современной разработке Java @RestController доминирует благодаря популярности REST API и микросервисной архитектуры.

Какие знаешь аннотация для создания контроллера? | PrepBro