注释方法的方面

时间:2013-08-28 04:56:59

标签: spring aspectj

我有一个带注释方法的类:

@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和方法名称检查,为每个基础方法提供单独的方面方法。
任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

按惯例,您可以为不同类型设置多个切入点,例如

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

您也可以制作自己的注释,例如@MemoizeRead, @MemoizeUpdate, @MemoizeAdd,以使切入点更加明确。

或者,您可以使用参数(例如@Cached(type=CacheType.READ))创建自定义注释,然后在您的方面使用switch语句。