2013-08-28 3 views
0

У меня есть класс с аннотациями методов:аспекта для аннотированных методов

@Service 
class MessageService{ 
    @AutoWired 
    MessageDao dao; 
    public void setDao(MessageDao dao){ 
     this.dao=dao; 
    } 
    @Memoize 
    public void addNode(Message m){ 

    } 
    @Memoize 
    public void updateNode(Message m){ 

    } 
    @Memoize 
    public List<Message> getMessagesByEntity(String key){ 

    } 
} 

мне нужно определить аспект, чтобы сделать некоторые кэширования подстановок служебной деятельности/@Around каждый из указанных выше способов:

@Around("@annotation(com.spring.aspects.Memoize)") 
    public Object handledMemoize(ProceedingJoinPoint pjp) throws Throwable 
    { 
     ..... 
...... 
..... 
     Object obj = pjp.proceed(); 
     if (args != null) 
     { 
      cache.put(Arrays.asList(args), obj); 
     } 
     return obj; 
    } 

Теперь характер активности кеша будет отличаться для каждого из вышеперечисленных методов.
Поэтому мне нужно, чтобы аспект вел себя по-разному в зависимости от действительного вызванного метода.
Как это достичь?
Я бы поверила, что лучшая практика будет отдельным аспектом для каждого из основных методов, объединив имя метода @Memoize и имя метода.
Любая помощь приветствуется.

+2

Какой смысл использовать «Аспект», если прокси-код не будет одинаковым для каждого метода? Почему бы просто не сделать это частью метода? –

+0

Прокси-код может быть одинаковым для классов/типов методов. Идея заключалась в том, чтобы определить, как идентифицировать тип как часть аннотации, когда есть еще одна аннотация в буксировке. – IUnknown

ответ

0

Вы можете иметь несколько срезов в для различных типов по соглашению, например

execution(* *.(@Memoize get*)(..)), 
execution(* *.(@Memoize add*)(..)), and 
execution(* *.(@Memoize update*)(..)) 

Вы также можете сделать свои собственные аннотации, как @MemoizeRead, @MemoizeUpdate, @MemoizeAdd, чтобы сделать более явными срезы в.

Или вы можете сделать пользовательскую аннотацию с параметром, например @Cached(type=CacheType.READ), а затем использовать оператор switch в своем аспекте.

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