编程语言
首页 > 编程语言> > java-使用Spring / AspectJ的建筑实施

java-使用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一起使用.

标签:spring-aop,aop,spring,java
来源: https://codeday.me/bug/20191119/2032237.html