← Назад к вопросам

Какие знаешь аннотации кроме @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 классы
@ControllerMVC контроллерWeb контроллеры
@RestControllerREST APIREST контроллеры
@BeanЯвное создание bean'а@Configuration методы
@AutowiredИнъекция зависимостейКонструктор, поле, setter
@ValueИнъекция значенийПоля
@TransactionalУправление транзакциямиМетоды сервисов
@ScheduledРасписание выполненияМетоды
@AsyncАсинхронное выполнениеМетоды
@AspectAOP аспектКлассы
@ValidВалидация данныхПараметры методов