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

Делал ли собственные аннотации

2.0 Middle🔥 61 комментариев
#Spring Framework#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Создание собственных аннотаций в Java

Да, создание собственных аннотаций — это частая и полезная практика. Я регулярно использую их для валидации, логирования и конфигурации приложений.

Синтаксис создания аннотации

Связная аннотация создаётся просто:

import java.lang.annotation.*;

@Target(ElementType.METHOD)           // где применяется
@Retention(RetentionPolicy.RUNTIME)   // когда существует
public @interface LogExecution {
    String value() default "method";   // параметр с дефолтом
}

Meta-аннотации

@Target — где можно применять:

  • ElementType.TYPE — класс, интерфейс, enum
  • ElementType.METHOD — метод
  • ElementType.FIELD — поле
  • ElementType.PARAMETER — параметр метода
  • ElementType.LOCAL_VARIABLE — локальная переменная

@Retention — сохранение в runtime:

  • RetentionPolicy.SOURCE — только в исходнике, удалится при компиляции
  • RetentionPolicy.CLASS — в bytecode, но не в runtime (дефолт)
  • RetentionPolicy.RUNTIME — доступна в runtime через рефлексию

Примеры собственных аннотаций

1. Аннотация для валидации

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEmail {
    String message() default "Email должен быть корректным";
}

public class User {
    @ValidEmail
    private String email;
}

2. Аннотация для логирования

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecution {
    LogLevel level() default LogLevel.INFO;
    
    enum LogLevel { INFO, DEBUG, ERROR }
}

public class PaymentService {
    @LogExecution(level = LogLevel.ERROR)
    public void processPayment(Order order) {
        // логирование через AOP или рефлексию
    }
}

3. Аннотация для кэширования

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cacheable {
    String key() default "";
    long ttl() default 3600; // время жизни в секундах
}

public class UserService {
    @Cacheable(key = "user:{id}", ttl = 7200)
    public User getUserById(Long id) {
        // результат будет закэширован
    }
}

Обработка аннотаций в runtime

Чтобы аннотация работала, нужна обработка через рефлексию или AOP:

public class AnnotationProcessor {
    public static void processLogging(Object obj) throws Exception {
        for (Method method : obj.getClass().getMethods()) {
            if (method.isAnnotationPresent(LogExecution.class)) {
                LogExecution log = method.getAnnotation(LogExecution.class);
                System.out.println("Выполняю метод: " + method.getName());
                System.out.println("Уровень: " + log.level());
            }
        }
    }
}

Аннотации в Spring Framework

В реальных проектах часто используются встроенные аннотации Spring:

@Component      // регистрация бина
@Service        // сервисный бин
@Repository     // репозиторий
@Autowired      // внедрение зависимостей
@Transactional  // управление транзакциями
@Cacheable      // кэширование
@Async          // асинхронное выполнение

Эти аннотации обрабатываются Spring через AOP (Aspect-Oriented Programming).

Когда создавать собственные аннотации

  1. Validation — кастомная валидация полей
  2. Cross-cutting concerns — логирование, профилирование, безопасность
  3. Configuration — кастомная конфигурация компонентов
  4. Performance tracking — измерение производительности методов
  5. API documentation — метаинформация для swagger/openapi

Ошибки, которых нужно избегать

  • Забыть @Retention(RetentionPolicy.RUNTIME) если нужна рефлексия
  • Использовать @Target(ElementType.TYPE) когда нужно METHOD
  • Игнорировать параметры аннотации при обработке
  • Не документировать назначение и использование аннотации

Собственные аннотации — мощный инструмент для создания чистого, читаемого и поддерживаемого кода.