Индивидуальная аннотация в 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 АОП.