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

Аннотации 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;
}
}

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

Код ITЗагрузка примера кода…


Web (Spring MVC)

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

Код ITЗагрузка примера кода…


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

АннотацияГде ставятЧто делает
@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 только для выбранного профиля

Код ITЗагрузка примера кода…


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

  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.

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