← Назад к вопросам
Какие знаешь аннотации кроме @Bean и @Component?
2.0 Middle🔥 111 комментариев
#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие знаешь аннотации кроме @Bean и @Component?
Spring имеет множество полезных аннотаций. Давайте рассмотрим самые важные из них.
Core Spring Annotations
// 1. @Service, @Repository, @Controller — специализированные @Component'ы
@Service // Для бизнес-логики (сервисов)
public class UserService {
public User createUser(UserRequest request) {
// Бизнес-логика
}
}
@Repository // Для работы с БД/persistence
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public User findById(UUID id) {
// Доступ к БД
}
}
@Controller // Для веб-контроллеров (MVC)
public class UserWebController {
@GetMapping("/users/{id}")
public String getUserPage(@PathVariable UUID id, Model model) {
// Возвращает имя view
}
}
@RestController // Для REST API (@Controller + @ResponseBody)
public class UserApiController {
@GetMapping("/api/users/{id}")
public UserDTO getUser(@PathVariable UUID id) {
// Автоматически конвертится в JSON
}
}
Dependency Injection
public class DependencyInjectionExample {
// 1. @Autowired — инъекция через поле (не рекомендуется)
@Autowired
private UserService userService; // Может быть null если нет bean'а
// 2. @Autowired на конструкторе (РЕКОМЕНДУЕТСЯ)
private final UserService userService;
private final OrderService orderService;
@Autowired
public MyClass(UserService userService, OrderService orderService) {
this.userService = userService;
this.orderService = orderService;
}
// 3. @Qualifier — выбор конкретного bean'а
@Autowired
@Qualifier("primaryEmailSender")
private EmailSender emailSender;
// 4. @Primary — дефолтный bean для injection'а
@Configuration
public class EmailConfig {
@Bean
@Primary
public EmailSender smtpEmailSender() {
return new SmtpEmailSender();
}
@Bean
public EmailSender fileEmailSender() {
return new FileEmailSender();
}
}
// 5. @Resource — Java стандарт для injection
@Resource(name = "primaryEmailSender")
private EmailSender emailSender;
// 6. @Value — инъекция значений из конфиг файлов
@Value("${app.name}")
private String appName;
@Value("${app.max-users:100}")
private int maxUsers; // Дефолт 100 если свойство не определено
@Value("#{T(java.lang.Math).PI}")
private double pi; // SpEL выражения
}
Transaction Management
public class TransactionExample {
// 1. @Transactional — управление транзакциями
@Service
public class UserService {
@Transactional
public void updateUser(UUID id, UserUpdateRequest request) {
// Вся операция в одной транзакции
// При исключении — rollback
}
// 2. readOnly оптимизация для queries
@Transactional(readOnly = true)
public User getUser(UUID id) {
// Только чтение, Hibernate не отслеживает изменения
}
// 3. Propagation и Isolation
@Transactional(
propagation = Propagation.REQUIRES_NEW,
isolation = Isolation.READ_COMMITTED,
timeout = 5,
rollbackFor = {SQLException.class, IOException.class}
)
public void criticalOperation() {
// Новая транзакция, даже если уже есть
}
}
}
Request Mapping & Request Handling
@RestController
@RequestMapping("/api/users")
public class UserController {
// 1. @GetMapping, @PostMapping, @PutMapping, @DeleteMapping
@GetMapping("/{id}")
public UserDTO getUser(@PathVariable UUID id) { }
@PostMapping
public UserDTO createUser(@RequestBody CreateUserRequest request) { }
@PutMapping("/{id}")
public UserDTO updateUser(@PathVariable UUID id, @RequestBody UpdateUserRequest request) { }
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable UUID id) { }
// 2. @RequestParam — параметры query строки
@GetMapping("/search")
public List<UserDTO> search(
@RequestParam String name,
@RequestParam(required = false, defaultValue = "0") int page,
@RequestParam(required = false) String email
) { }
// 3. @PathVariable — переменные в URL
@GetMapping("/{userId}/orders/{orderId}")
public OrderDTO getUserOrder(
@PathVariable UUID userId,
@PathVariable UUID orderId
) { }
// 4. @RequestHeader — заголовки HTTP
@GetMapping
public List<UserDTO> getUsers(
@RequestHeader("Authorization") String token,
@RequestHeader(value = "X-Request-ID", required = false) String requestId
) { }
// 5. @CookieValue — значения cookie
@GetMapping
public void somethingWithCookie(@CookieValue("sessionId") String sessionId) { }
// 6. @RequestAttribute — атрибуты request'а
@PostMapping
public void createUser(
@RequestBody CreateUserRequest request,
@RequestAttribute UUID currentUserId
) { }
// 7. @ModelAttribute — связывание параметров query
@PostMapping
public void createUser(@ModelAttribute UserForm form) {
// Автоматически заполняет поля из query параметров
}
}
Data Validation
public class ValidationExample {
// 1. @Valid и @Validated
@RestController
public class UserController {
@PostMapping("/users")
public UserDTO createUser(@Valid @RequestBody CreateUserRequest request) {
// Spring валидирует request перед методом
}
}
// 2. Constraints аннотации (от javax.validation)
public class CreateUserRequest {
@NotBlank(message = "Email не может быть пустым")
@Email
private String email;
@NotNull
@Size(min = 2, max = 255)
private String name;
@Min(18)
@Max(120)
private int age;
@Pattern(regexp = "\\d{10}")
private String phone;
@DecimalMin("0.0")
@DecimalMax("10000.0")
private BigDecimal salary;
@Past // Дата в прошлом
private LocalDate birthDate;
@Future // Дата в будущем
private LocalDateTime eventDate;
}
}
Configuration & Aspects
public class ConfigurationExample {
// 1. @Configuration — Bean конфигурация
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
// 2. @Aspect — AOP аспекты
@Aspect
@Component
public class LoggingAspect {
@Pointcut("@annotation(com.example.annotations.Loggable)")
public void loggableMethods() {}
@Before("loggableMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Calling: " + joinPoint.getSignature());
}
@AfterReturning(pointcut = "loggableMethods()", returning = "result")
public void logAfter(JoinPoint joinPoint, Object result) {
System.out.println("Result: " + result);
}
@Around("loggableMethods()")
public Object logAround(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.proceed();
long duration = System.currentTimeMillis() - start;
System.out.println("Duration: " + duration + "ms");
return result;
}
}
}
Scheduling & Async
public class SchedulingExample {
// 1. @EnableScheduling и @Scheduled
@Configuration
@EnableScheduling
public class SchedulingConfig {}
@Service
public class ReportService {
@Scheduled(cron = "0 0 * * * *") // Каждый час
public void generateReport() {
// Выполняется асинхронно по расписанию
}
@Scheduled(fixedRate = 5000) // Каждые 5 секунд
public void sendHeartbeat() {}
@Scheduled(fixedDelay = 1000) // Через 1 сек после окончания
public void cleanupCache() {}
}
// 2. @EnableAsync и @Async
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(5);
executor.initialize();
return executor;
}
}
@Service
public class EmailService {
@Async
public CompletableFuture<Boolean> sendEmail(String to, String subject) {
// Выполняется в отдельном потоке
return CompletableFuture.completedFuture(true);
}
}
}
Testing
public class TestingAnnotations {
// 1. @SpringBootTest — полный контекст приложения
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@MockBean
private UserRepository userRepository;
@Test
void testCreateUser() {
// Тест с полным Spring контекстом
}
}
// 2. @WebMvcTest — тестирование контроллеров
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void testGetUser() throws Exception {
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk());
}
}
// 3. @DataJpaTest — тестирование repositories
@DataJpaTest
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
void testFindByEmail() {
User user = userRepository.findByEmail("test@example.com");
assertNotNull(user);
}
}
}
Таблица основных аннотаций
| Аннотация | Назначение | Где использовать |
|---|---|---|
| @Component | Регистрация bean'а | Классы |
| @Service | Бизнес-логика | Service классы |
| @Repository | Доступ к БД | DAO/Repository классы |
| @Controller | MVC контроллер | Web контроллеры |
| @RestController | REST API | REST контроллеры |
| @Bean | Явное создание bean'а | @Configuration методы |
| @Autowired | Инъекция зависимостей | Конструктор, поле, setter |
| @Value | Инъекция значений | Поля |
| @Transactional | Управление транзакциями | Методы сервисов |
| @Scheduled | Расписание выполнения | Методы |
| @Async | Асинхронное выполнение | Методы |
| @Aspect | AOP аспект | Классы |
| @Valid | Валидация данных | Параметры методов |