Индивидуальная аннотация в spring

Я видел несколько примеров, в которых использовались индивидуальные аннотации. пример

@SimpleAnnotation
class SampleBean {
  @SimpleAnnotation
  public String getName() {
    return "AAA";
  }

  public void setName(String name) {
  }

  public int getHeight() {
    return 201;
  }
}

@Target( { ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@interface SimpleAnnotation {
}

Может кто-нибудь сказать, почему мы это используем?

Ответ 1

Spring поддерживает для многих Annotation концепцию "мета-аннотации". (Я не уверен, что это для всех.)

Это означает, что вы можете создать свою собственную аннотацию и аннотировать аннотацию одной из основных аннотаций пружин.

Например:

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Service
public @interface MyService {

}

Затем вы можете использовать эту аннотацию вместо @Service. (Btw: @Service, @Repository, @Controller используют ту же самую технику для "наследования" из @Component)


Один пример, который сильно использует это, "наследуется" от @Qualifier. Для примера и некоторых объяснений см. Spring Справочная информация: 3.9.3 Точная настройка автонастройки на основе аннотаций с квалификаторами (Пример с @Genre находится в конце главы.)

Одна очень полезная конструкция, которая может быть выполнена с помощью этой методики, заключается в том, что она позволяет объединить несколько аннотаций в (в вашем случае использования) больше смысла. Поэтому вместо того, чтобы писать в каждом классе какого-либо типа все те же две аннотации, например: @Service и @Qualifiyer("someting") (org.springframework.beans.factory.annotation.Qualifier). Вы можете создать свою аннотацию, аннотированную этими двумя аннотациями, а затем использовать в своей beans только одну пользовательскую аннотацию. (@See Избегать Spring Код аннотации Запах Использовать Spring 3 пользовательских аннотации)

Если вы хотите увидеть, насколько мощный этот метод может быть использован, вы можете взглянуть на инфраструктуру внедрения контекста и зависимостей.


Вопрос из комментария:

В @interface также есть некоторые переменные, определенные внутри него, что это значит?

Аннотации (определенные в @Interface) работают немного как beans. Эти поля являются свойствами, которые могут/должны быть определены, если вы используете аннотации. Значения могут быть позже прочитаны через API отражения.

Например, @Controller Аннотация в Spring:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
   String value() default "";
}

Поле с именем value - это поле, которое можно использовать без явного имени: (@Controller("myUrl") - тот же @Controller(value="myUrl"))

Ответ 2

Вы можете создать свои собственные мета-аннотации, которые собирают несколько других аннотаций Spring, чтобы уменьшить мета-шаблон в коде:

@Service
@Scope(value = "prototype")
@Transactional(readOnly = true, rollbackFor = RuntimeException.class)
public @interface ReadOnlyService {}

И тогда вы можете просто написать:

@ReadOnlyService
public class RoleService {

}

Spring найдет @ReadOnlyService и семантически заменит его:

@Service
@Scope(value = "prototype")
@Transactional(readOnly = true, rollbackFor = RuntimeException.class)
public class RoleService {

}

Конечно, если пользовательские аннотации оплачиваются, когда у вас есть тонны сервисов, аннотированных с тем же набором аннотаций Spring, которые могут быть заменены одной, хорошо названной аннотацией.

Примеры взяты из: Избегайте Spring Код примечания Запах: используйте Spring 3 пользовательских аннотации

Ответ 3

Пользовательские аннотации ничего не делают сами по себе. Это простые маркеры в коде. Их реальная власть исходит от инструментов, которые ищут конкретные аннотации. Как и некоторые другие ответы, Spring использует несколько аннотаций и теперь механизмы для определения ваших собственных типов компонентов. Довольно аккуратно. Еще один пример: несколько недель назад я использовал AOP и несколько пользовательских аннотаций для обеспечения простого кэширования результатов уровня метода. Теперь, когда у меня есть механизм кэширования на месте, и соответствующие привязки AOP определены, если я хочу кэшировать метод, я просто добавляю эту аннотацию. Некоторые люди просто используют аннотации в качестве фантастических метаданных для улучшения удобочитаемости.

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

Ответ 4

Лучшая часть использования пользовательских аннотаций заключается в том, что вам не нужно настраивать конфигурацию, Spring автоматически обнаружит, что эти beans являются сервисными компонентами, и все будет работать нормально. Пользовательские аннотации - очень маленькая функция, добавленная в Spring, но очень полезная. Подробнее см. Здесь

http://java.dzone.com/articles/avoid-spring-annotation-code-smell-use-spring3-custom-annotations

Ответ 5

Два варианта:

  • вам нужна аннотация @Component в пользовательской аннотации. Таким образом, вы можете использовать свою пользовательскую аннотацию для обозначения классов как beans. Кроме того, вы можете добавить область по умолчанию и другую метаинформацию

  • - вы можете использовать аннотации спецификаторов (аннотированные с мета-аннотацией @Qualifier), чтобы различать реализации одного и того же интерфейса.

Ответ 6

Общим шаблоном также является использование аннотаций в точках APOP. Не специально Spring, но часто используется при использовании Spring АОП.