2017-02-20 26 views
0

Когда мы используем Play Framework Action Composition, мы можем напрямую использовать аннотацию @With, так как explained here. В качестве альтернативы мы можем определить custom action annotations.Если мы можем непосредственно выполнить композицию действий, используя @With annotation, то зачем нам создавать пользовательские аннотации с использованием интерфейсов?

Но каковы преимущества определения собственных аннотаций? Это похоже на то, что мы просто добавляем среднего человека (интерфейс).

И еще одно сомнение: при реализации класса действия мы используем generics для указания соответствующего интерфейса. Это просто потому, что Play безопасен по типу? В документах, которые они упомянули, «Определение действия получает аннотацию как конфигурацию». Это просто потому, что мы можем настроить с помощью пользовательских аннотаций?

ответ

1

Подумайте о следующей аннотации:

@With(CacheAction.class) 
@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Cached { 
    String key(); 
    Long expires(); 
    String region(); 
} 

С выше аннотациями, вы можете аннотировать свои действия, как:

@Cached(
    key = "my.cached.page", 
    expires = 30, 
    region = "pages" 
) 
public Result index() { 
    ... 
} 

Итак, как бы вы передать эти конфигурации кэша композиторского действию с использованием @With аннотация? Ты не мог. @With хорош, если вам не нужно настраивать, как будет вести себя композиционное действие, например, вести журнал в примерах документации. Но если вам нужно, они объявляют ваши собственные аннотации.

Action класс ожидает, что тип аннотации, потому что вы можете извлечь configuration при вызове действия слагающих:

public CompletionStage<Result> call(Context ctx) { 
    Cached cacheConfiguration = this.configuration; 
    String key = cacheConfiguration.key(); 
    Long expires = cacheConfiguration.expires(); 
    string region = cacheConfiguration.region(); 

    ... 
} 

Наконец, определяя свои собственные аннотации хорошо, потому что вы можете лучше выразить смысловое отношение к ним (это действие @Cached, это действие @Authenticated и т. д.).

 Смежные вопросы

  • Нет связанных вопросов^_^