为了账号安全,请及时绑定邮箱和手机立即绑定

访问spring bean代理引用本身

访问spring bean代理引用本身

月关宝盒 2022-06-30 18:34:42
我对注释@Cacheable有疑问。@CacheEviction当我在声明它们的 bean 中调用这些方法时,aop 部分没有被执行。造成这种情况的根本原因是 bean 访问了它自己的实例本身,而不是访问了 spring 代理。我读过这个问题,据说在大多数情况下,不需要 bean 访问代理。可能这些答案对我有用。问题是:还有其他方法可以使带注释的方法起作用吗?或者听起来我找到了一个 bean 需要访问代理本身的充分理由?
查看完整描述

1 回答

?
慕哥9229398

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());


查看完整回答
反对 回复 2022-06-30
  • 1 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信