Какие ключевые аннотации Spring Boot используются для создания REST API и конфигурации приложения?

«Какие ключевые аннотации Spring Boot используются для создания REST API и конфигурации приложения?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring Boot предоставляет аннотации для быстрой разработки. Вот ключевые из них, сгруппированные по назначению.

1. Запуск и конфигурация приложения

  • @SpringBootApplicationМета-аннотация, объединяющая:
    • @SpringBootConfiguration (вариант @Configuration)
    • @EnableAutoConfiguration – включает автоматическую настройку Spring на основе classpath.
    • @ComponentScan – сканирует пакеты на наличие компонентов (@Component, @Service и т.д.). Ставится на главный класс приложения.

2. Создание REST-контроллера

  • @RestController = @Controller + @ResponseBody. Указывает, что класс обрабатывает HTTP-запросы, а возвращаемые значения методов записываются прямо в тело HTTP-ответа (обычно как JSON).
  • @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping – маппинг HTTP-запросов на методы контроллера.

3. Внедрение зависимостей и объявление бинов

  • @Autowired – автоматическое внедрение зависимости (через конструктор, поле или сеттер). Лучшая практика: использовать внедрение через конструктор (без аннотации над полем, если в классе один конструктор).
  • @Component, @Service, @Repository, @Controller – стереотипные аннотации для объявления Spring-бинов. @Repository дополнительно транслирует исключения БД в DataAccessException.
  • @Bean – объявляет бин в классе, помеченном @Configuration. Используется для настройки сторонних компонентов.

4. Работа с конфигурацией

  • @Value – инъекция значений из application.properties/application.yml в поле.
  • @ConfigurationProperties – привязка и валидация группы свойств к POJO-классу (предпочтительнее @Value для сложных конфигураций).
  • @Profile – условная регистрация бина или конфигурации только при активном профиле (например, "dev", "prod").

Пример REST-контроллера:

@RestController
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService; // Внедрение через конструктор
    public UserController(UserService userService) {
        this.userService = userService;
    }
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody UserDto userDto) {
        User created = userService.create(userDto);
        return ResponseEntity.created(URI.create("/api/users/" + created.getId())).body(created);
    }
}