Какие основные аннотации используются в Spring Framework?

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

Ответ

Аннотации Spring можно разделить на несколько ключевых категорий:

1. Аннотации для объявления бинов (стереотипные)

  • @Component — универсальный маркер для любого управляемого Spring bean.
  • @Service — специализация @Component для бизнес-логики (сервисного слоя).
  • @Repository — для слоя доступа к данным (DAO). Добавляет трансляцию исключений JDBC в DataAccessException.
  • @Controller / @RestController — для веб-слоя (MVC и REST контроллеры).

2. Аннотации для внедрения зависимостей (DI)

  • @Autowired — автоматическое связывание по типу.
  • @Qualifier("имяБина") — уточняет, какой конкретный бин внедрить при наличии нескольких кандидатов.
  • @Value("${property.name}") — внедряет значение из файла свойств (application.properties).

3. Аннотации для конфигурации

  • @Configuration — указывает, что класс содержит конфигурацию на основе бинов.
  • @Bean — объявляет бин в методе конфигурационного класса.
  • @Profile("dev") — активирует бин/конфигурацию только для указанного профиля.
  • @PropertySource("classpath:app.properties") — загружает файл свойств.

4. Аннотации для Spring MVC / REST

  • @RequestMapping, @GetMapping, @PostMapping и др. — маппинг HTTP-запросов.
  • @PathVariable — извлечение переменной из пути URL.
  • @RequestParam — извлечение параметра из строки запроса.
  • @RequestBody / @ResponseBody — привязка тела запроса/ответа.

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

@RestController // = @Controller + @ResponseBody
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user);
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody UserDto userDto) {
        User created = userService.create(userDto);
        return ResponseEntity.status(HttpStatus.CREATED).body(created);
    }
}