Аннотации Spring Boot
Когда эта статья полезна
Эта глава нужна, когда вы уже запускаете проект на Spring Boot и хотите быстро понимать:
- какую аннотацию ставить на класс, метод или параметр;
- чем отличаются похожие аннотации (
@Componentи@Service,@Controllerи@RestController); - какие аннотации чаще всего используются в реальном REST-приложении.
Статья не заменяет полную документацию, а дает рабочую карту: от старта приложения до тестирования.
Базовые аннотации старта и конфигурации
| Аннотация | Где ставят | Что делает |
|---|---|---|
@SpringBootApplication | Класс с main | Включает автонастройку, сканирование компонентов и bootstrapping приложения |
@Configuration | Конфиг-класс | Объявляет класс как источник bean-определений |
@Bean | Метод в @Configuration | Регистрирует возвращаемый объект как bean в контексте |
@Value | Поле/конструктор/параметр | Подставляет значение из application.properties/env |
@ConfigurationProperties | POJO + конфиг | Типобезопасно биндингует группу настроек по префиксу |
@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Загрузка примера кода…
Частые ошибки с аннотациями
- Ставить
@Autowiredна поля вместо конструктора: тестировать и поддерживать сложнее. - Смешивать доменную модель и API-модель: валидация DTO и JPA-сущности начинают конфликтовать.
- Помечать все подряд
@Transactional: растут блокировки и сложнее понимать границы транзакций. - Использовать
@Componentвезде: теряется роль класса; лучше@Service,@Repository,@RestControllerпо назначению. - Добавлять
@Enable...аннотации без необходимости: в Boot многое уже включается автонастройкой.
Мини-чеклист выбора аннотации
- Нужен управляемый объект Spring:
@Componentили профильный стереотип. - Нужен HTTP endpoint:
@RestController+@GetMapping/@PostMapping. - Нужна валидация входа:
@Validна параметре + ограничения в DTO. - Нужна работа с БД —
@Entity, репозиторий,@Transactionalв сервисе. - Нужна проверка прав:
@PreAuthorizeна методах сервиса/контроллера. - Нужен тест с контекстом — выбрать между
@SpringBootTest,@WebMvcTest,@DataJpaTest.
Связанные материалы
- Первая программа на Spring Framework
- Spring Framework
- Spring Security Basic
- JWT в Spring Boot
- JPA в Spring