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

Ответ

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);
    }
}

Ответ 18+ 🔞

А, ну вот, опять эти ваши спринг-буты, блядь! Слушай, я тебе сейчас так разложу эти аннотации, что ты, сука, сам как отлаженный микросервис заработаешь. Погнали, только не перебивай, а то в рот меня чих-пых!

1. Запуск и конфигурация — чтоб всё полетело

  • @SpringBootApplication – это, блядь, три в одном, как шампунь-кондиционер-гель для душа, ёпта! Внутри у неё:
    • @SpringBootConfiguration (просто @Configuration, но в пафосной шляпе).
    • @EnableAutoConfiguration – эта штука, сука, сама всё по класспафу находит и настраивает. Магия, блядь, чистой воды! Подкинул зависимость — она уже знает, что делать.
    • @ComponentScan – сканирует пакеты, как маньяк, ищет все @Component, @Service и прочую хуйню. Вешаешь эту аннотацию на главный класс — и приложение, блядь, готово к запуску. Красота!

2. Делаем REST-контроллер — чтоб отдавал JSON как бог

  • @RestController – это @Controller и @ResponseBody в одном флаконе. Говорит: «Мужик, всё, что метод вернёт, пиши сразу в тело ответа, обычно в JSON, и не парься».
  • @GetMapping, @PostMapping и прочие @...Mapping – это, блядь, указатели. Говорят: «Эй, запрос на /users методом GET? Заходи, дружок, вот этот метод тебя обслужит».

3. Внедрение зависимостей — чтоб всё само подключалось

  • @Autowired – автоматическое внедрение. Но слушай сюда, умник: лучшая практика — это внедрять через конструктор! Сделал один конструктор — Spring сам всё подсует. Никаких аннотаций над полями не нужно, выглядит чисто, как слеза младенца.
  • @Component, @Service, @Repository, @Controller – это, типа, профессии для твоих классов. @Repository ещё и исключения из SQL-говна в нормальные Spring'овские переводит — удобно, блядь!
  • @Bean – когда нужно настроить какую-то стороннюю либу, которую ты не писал. Объявляешь в @Configuration-классе — и всё, бин готов.

4. Конфигурация — чтоб не хардкодить

  • @Value – берёт значение из application.properties и тыкает его прямо в поле. Типа @Value("${server.port}").
  • @ConfigurationProperties – это, блядь, круче! Не тыкай по одному значению, а засунь сразу кучу свойств в один POJO-класс. Красиво и удобно.
  • @Profile – условная хуйня. Бин будет создан только если активен нужный профиль (типа "dev" или "prod"). Чтоб в продакшене не светить отладочной фигнёй.

Ну и пример контроллера, чтоб ты понимал масштаб:

@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);
    }
}

Вот и вся магия, ёпта! Ничего сложного. Главное — не начинай с @Autowired над каждым полем, как последний распиздяй. Через конструктор, блядь, через конструктор! И будет тебе счастье.