1 回答
TA贡献1877条经验 获得超6个赞
正如 Spring 用户手册中详细记录的那样,自调用不能与 Spring AOP 一起使用,因为 Spring AOP 使用代理。所以如果你想让自调用触发一个切面,请通过 LTW (load-time weaving) 切换到完整的 AspectJ。它适用于原始 bean,不使用任何代理。
更新:如果您想避免使用本机 AspectJ,而是作为(相当蹩脚和反 AOP)解决方法想让您的组件代理感知,当然您可以使用自注入并使用自动连线引用缓存方法像这样的代理:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
@Component
public class MyComponent {
@Autowired
MyComponent myComponent;
public void doSomething() {
System.out.println(myComponent.doCacheable());
System.out.println(myComponent.doCacheable());
System.out.println(myComponent.doCacheable());
}
@Cacheable("myCache")
public String doCacheable() {
return "" + System.nanoTime();
}
}
调用bean 应该会产生如下输出doSomething():MyComponent
247760543178800
247760543178800
247760543178800
这证明缓存是这样工作的。相反,如果您只有三行或者来自另一个(现已删除)答案System.out.println(doCacheable());的奇怪、无意义的变体,那么您将在控制台上获得三个不同的值,即不会缓存任何内容。 System.out.println(MyComponent.this.doCacheable());
添加回答
举报