2016-03-08 63 views
3

我有一個Spring項目使用註釋來應用(尤其是)緩存。使用Spring/AspectJ的建築執法

我的理解是,這些註釋只有在@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; 
} 

我在尋找的是一種強制執行的方法,即公共方法不應該能夠調用同一類的其他公共方法。

我嘗試了一些類似於這裏使用的方法http://www.jayway.com/2010/03/28/architectural-enforcement-with-aid-of-aspectj,但是在對同一個類應用限制時它就不夠用了。

回答

3

這是完全可行的,AspectJ非常強大。但是你似乎在使用Spring AOP而不是AspectJ,與AspectJ相比,Spring AOP相當有限。 Spring AOP通過在你的實際bean實現上創建代理來實現它提供的AOP特性。當代理得到這個調用時,這個通知就會被應用,流量控制將被傳遞給正常的bean。如果普通bean(代理的目標)自己調用另一個方法,它將不會在代理上調用,所以AOP部分將被繞過。 AspectJ沒有這個限制,因爲它修改你的類,而不僅僅是創建代理。我強烈建議使用AspectJ而不是Spring AOP。 Spring也將與AspectJ一起工作。