Перейти к основному содержимому

Аннотации Spring Boot

Разработчику Архитектору

Когда эта статья полезна

Эта глава нужна, когда вы уже запускаете проект на Spring Boot и хотите быстро понимать:

  • какую аннотацию ставить на класс, метод или параметр;
  • чем отличаются похожие аннотации (@Component и @Service, @Controller и @RestController);
  • какие аннотации чаще всего используются в реальном REST-приложении.

Статья не заменяет полную документацию, а дает рабочую карту: от старта приложения до тестирования.


Базовые аннотации старта и конфигурации

АннотацияГде ставятЧто делает
@SpringBootApplicationКласс с mainВключает автонастройку, сканирование компонентов и bootstrapping приложения
@ConfigurationКонфиг-классОбъявляет класс как источник bean-определений
@BeanМетод в @ConfigurationРегистрирует возвращаемый объект как bean в контексте
@ValueПоле/конструктор/параметрПодставляет значение из application.properties/env
@ConfigurationPropertiesPOJO + конфигТипобезопасно биндингует группу настроек по префиксу
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Configuration
public class AppConfig {
@Bean
public Clock appClock() {
return Clock.systemUTC();
}
}

DI и компоненты

АннотацияГде ставятЧто делает
@ComponentКлассБазовый стереотип bean-компонента
@ServiceКлассКомпонент бизнес-логики (семантический стереотип)
@RepositoryКласс/интерфейсСлой доступа к данным; трансляция исключений Spring Data
@ControllerКлассMVC-контроллер для view-шаблонов
@RestControllerКлассREST-контроллер (@Controller + @ResponseBody)
@AutowiredКонструктор/поле/сеттерВнедряет зависимость из контекста
@QualifierПараметр/полеУточняет, какой bean брать при нескольких реализациях
@PrimaryКласс/метод @BeanДелает bean выбором по умолчанию

Рекомендуемый стиль: конструкторная инъекция без полей @Autowired.

@Service
public class PaymentService {
private final Clock clock;

public PaymentService(Clock clock) {
this.clock = clock;
}
}

Когда реализаций несколько:

public interface Notifier {
void send(String message);
}

@Component("emailNotifier")
class EmailNotifier implements Notifier {
public void send(String message) {}
}

@Component
class AlertService {
private final Notifier notifier;

public AlertService(@Qualifier("emailNotifier") Notifier notifier) {
this.notifier = notifier;
}
}

Web (Spring MVC)

АннотацияГде ставятЧто делает
@RequestMappingКласс/методБазовый URL и HTTP-ограничения
@GetMapping, @PostMapping, @PutMapping, @DeleteMappingМетодКороткие формы @RequestMapping(method=...)
@PathVariableПараметр методаБерет значение из URL-пути
@RequestParamПараметр методаБерет query-параметр
@RequestBodyПараметр методаДесериализует JSON/XML в объект
@ResponseBodyМетодВозвращает тело ответа напрямую
@CrossOriginКласс/методРазрешает CORS для браузерных клиентов
@RestController
@RequestMapping("/api/users")
public class UserController {

@GetMapping("/{id}")
public UserDto getById(@PathVariable Long id) {
return new UserDto(id, "Alex");
}

@PostMapping
public UserDto create(@RequestBody CreateUserRequest request) {
return new UserDto(1L, request.name());
}

@GetMapping
public List<UserDto> search(@RequestParam(defaultValue = "0") int page) {
return List.of(new UserDto(1L, "Alex"));
}
}

Валидация запросов

АннотацияГде ставятЧто делает
@ValidПараметр методаЗапускает Bean Validation для объекта
@NotNull, @NotBlank, @Size, @Email, @Min и др.Поля DTOОписывает ограничения входных данных
@ValidatedКласс/контроллерВключает валидацию для параметров методов и групп
public record CreateUserRequest(
@NotBlank @Size(max = 64) String name,
@Email String email
) {}

@PostMapping
public UserDto create(@Valid @RequestBody CreateUserRequest request) {
return service.create(request);
}

Практика: держите валидацию на границе API (DTO), а бизнес-правила - в сервисах.


Данные и JPA

АннотацияГде ставятЧто делает
@EntityКласс моделиПомечает JPA-сущность
@TableКлассНастраивает имя таблицы и индексы
@IdПолеПервичный ключ
@GeneratedValueПоле @IdСтратегия генерации ключа
@ColumnПолеНастройки колонки (nullable, length, unique)
@ManyToOne, @OneToMany, @JoinColumnПоляСвязи между сущностями
@EnableJpaRepositoriesКонфиг (редко вручную)Явно включает сканирование репозиториев
@TransactionalМетод/классГраница транзакции
@Entity
@Table(name = "users")
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, length = 64)
private String name;
}

Безопасность

АннотацияГде ставятЧто делает
@EnableWebSecurityКонфиг-классВключает Spring Security конфигурацию
@PreAuthorizeМетодПроверка доступа до выполнения (SpEL)
@PostAuthorizeМетодПроверка после выполнения
@SecuredМетодПроверка по ролям (legacy-стиль, но используется)
@WithMockUserТест-методПоднимает тестового пользователя в SecurityContext
@Service
public class AdminService {
@PreAuthorize("hasRole('ADMIN')")
public void rebuildIndex() {
// admin only
}
}

Тестирование Spring Boot

АннотацияГде ставятЧто делает
@SpringBootTestТест-классПоднимает полный контекст приложения
@WebMvcTestТест-классСрез для MVC-слоя (контроллеры)
@DataJpaTestТест-классСрез для JPA/репозиториев
@MockBeanПоле тестаПодменяет bean mock-объектом в контексте
@TestConfigurationВнутренний тестовый конфигДополнительные bean только для тестов
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired private MockMvc mockMvc;
@MockBean private UserService userService;
}

Условная загрузка и профили

АннотацияГде ставятЧто делает
@ConditionalOnPropertyКонфиг/beanСоздает bean только при нужном свойстве
@ConditionalOnClassАвтоконфигСоздает bean, если класс есть в classpath
@ProfileКласс/метод @BeanАктивирует bean только для выбранного профиля
@Configuration
class StorageConfig {
@Bean
@Profile("dev")
Storage localStorage() {
return new LocalStorage();
}

@Bean
@Profile("prod")
Storage s3Storage() {
return new S3Storage();
}
}

Частые ошибки с аннотациями

  1. Ставить @Autowired на поля вместо конструктора: тестировать и поддерживать сложнее.
  2. Смешивать доменную модель и API-модель: валидация DTO и JPA-сущности начинают конфликтовать.
  3. Помечать все подряд @Transactional: растут блокировки и сложнее понимать границы транзакций.
  4. Использовать @Component везде: теряется роль класса; лучше @Service, @Repository, @RestController по назначению.
  5. Добавлять @Enable... аннотации без необходимости: в Boot многое уже включается автонастройкой.

Мини-чеклист выбора аннотации

  • Нужен управляемый объект Spring: @Component или профильный стереотип.
  • Нужен HTTP endpoint: @RestController + @GetMapping/@PostMapping.
  • Нужна валидация входа: @Valid на параметре + ограничения в DTO.
  • Нужна работа с БД: @Entity, репозиторий, @Transactional в сервисе.
  • Нужна проверка прав: @PreAuthorize на методах сервиса/контроллера.
  • Нужен тест с контекстом: выбрать между @SpringBootTest, @WebMvcTest, @DataJpaTest.

Связанные материалы