Java 使用Spring/AspectJ的体系结构实施

Java 使用Spring/AspectJ的体系结构实施,java,spring,aop,spring-aop,Java,Spring,Aop,Spring Aop,我有一个Spring项目使用注释来应用(除其他外)缓存 我的理解是,这些注释只有在@Autowired并通过SpringAOP调用时才起作用 这意味着,如果一个方法调用同一类中的另一个方法,那么第二个方法上的任何注释都将被忽略,例如 @Cacheable(...) public Animal getAnimal(int id) { return get(m_url, id); } public Cage getCagedAnimal(int id) { Animal anima

我有一个Spring项目使用注释来应用(除其他外)缓存

我的理解是,这些注释只有在@Autowired并通过SpringAOP调用时才起作用

这意味着,如果一个方法调用同一类中的另一个方法,那么第二个方法上的任何注释都将被忽略,例如

@Cacheable(...)
public Animal getAnimal(int id) {
    return get(m_url, id);
}

public Cage getCagedAnimal(int id) {
    Animal animal = getAnimal(id);  // This call will not apply @Cacheable
    Cage cagedAnimal = new Cage(animal);
    return cagedAnimal;
}
我正在寻找的是一种方法来强制执行此操作,即公共方法不应该能够调用同一类的其他公共方法


我尝试应用类似于这里使用的方法,但在对同一类应用限制时,它有不足之处。

这是完全可行的,AspectJ非常强大。但是您似乎在使用SpringAOP而不是AspectJ,与AspectJ相比,SpringAOP非常有限。SpringAOP通过围绕实际bean实现创建代理来实现它提供的AOP特性。当代理收到调用时,将应用通知,并将流控制传递给普通bean。如果普通bean(代理的目标)在自身上调用另一个方法,则不会在代理上调用它,因此将绕过AOP部分。AspectJ没有这个限制,因为它修改类,而不仅仅是围绕类创建代理。我强烈建议使用AspectJ而不是SpringAOP。Spring也可以与AspectJ一起工作