繁体   English   中英

使用Spring / AspectJ进行架构实施

[英]Architectural Enforcement Using Spring/AspectJ

我有一个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;
}

我正在寻找的是一种强制执行此方法的方法,即公共方法不应该能够调用同一类的其他公共方法。

我尝试应用与此处使用的方法类似的内容http://www.jayway.com/2010/03/28/architectural-enforcement-with-aid-of-aspectj但是在同一类上应用限制时不尽如人意。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM