Вопрос проверяет знание устройства аннотаций и понимание, как и где они доступны.
@Target определяет, к каким элементам кода можно применять аннотацию. @Retention определяет, как долго аннотация хранится и доступна ли она в runtime. Существует три варианта RetentionPolicy: SOURCE, CLASS и RUNTIME. От выбранного retention зависит, сможет ли аннотацию использовать фреймворк. Для Spring обычно нужен RUNTIME.
Аннотация — это не только её поля, но и правила использования.
@Target — указывает, к каким элементам Java-кода можно применять аннотацию.@Retention — указывает, на каком этапе жизни программы аннотация доступна.
@TargetОпределяет область применения аннотации.
Примеры:
ElementType.TYPE — класс, интерфейс
ElementType.METHOD — метод
ElementType.FIELD — поле
ElementType.PARAMETER — параметр
ElementType.CONSTRUCTOR — конструктор
Пример:
@Target(ElementType.METHOD)
public @interface Loggable {
}
@RetentionОпределяет, как долго аннотация существует.
RetentionPolicySOURCE
Доступна только в исходном коде
Не попадает в байткод
Используется для подсказок и проверок
CLASS
Попадает в байткод
Недоступна через reflection в runtime
Значение по умолчанию
RUNTIME
Доступна в runtime
Читается через reflection
Используется фреймворками
RUNTIMESpring:
Сканирует классы
Читает аннотации через reflection
Принимает решения на основе metadata
Без RUNTIME аннотация просто «невидима» контейнеру.
@Target ограничивает место применения аннотации, а @Retention — время её жизни. Для фреймворков почти всегда нужен RetentionPolicy.RUNTIME.