@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}
Тут видно, что аннотация @Retention стоит собственно над объявлением самой аннотации @Retention. И такой трюк можно делать не только с мета-аннотациями, а и с обычными, рукотворными. Где происходит магия при загрузке классов аннотаций, и почему это всё работает?
Никакой магии нет. Все аннотации обрабатываются на этапе компиляции. В общем случае, аннотирование аннотации дает наследование. На примере Spring, есть аннотация @Component, которая сигнализирует, что аннотированный класс является бином, который должен быть обработан Spring-ом. Так же есть аннотация @Service, которая якобы сообщает нам, что аннотированный класс является сервисом. На самом деле аннотация @Service помечена аннотацией @Component, поэтому Spring также понимает такой класс как свой бин. А название Service дано просто для удобочитаемости кода. Вы можете написать свои аннотации, пометить их другими аннотациями, тем самым унаследуете свойства этих аннотаций. К @RetentionPolicy и @Target это не относится, они обрабатываются по-своему. Для более глубокого погружения в тему гуглите Java Annotation Processing.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости