【问题标题】:Spring AOP - how do I cast a proxied bean?Spring AOP - 我如何转换代理 bean?
【发布时间】:2010-10-29 20:09:13
【问题描述】:

我已经在一个 bean 上配置了 Spring-AOP。

当我访问这个 bean 时,它会返回一个 spring 代理类而不是实际的 bean。

有什么办法可以得到真正的豆子吗?

applicationContext.xml

<bean id="abc" class="abc.java" />

一些.java

abc a = (abc)applicationContext.getBean("abc")

这会抛出:

java.lang.ClassCastException: $Proxy19

【问题讨论】:

  • 能否提供这个bean的spring配置?
  • 'abc' 是一个具体的类还是一个接口?

标签: spring aop


【解决方案1】:

对于初学者,您肯定必须将其转换为代理对象。然后试试:

Proxy.getTargetSource().getTarget

我真的不知道这是否可行,AOP 文档在描述代理类的返回类型时非常模棱两可,它说诸如“返回

【讨论】:

  • 谢谢你的解决方案部分正确。 org.springframework.aop.framework.Advised 类可以解决问题。建议的建议=(建议的)代理;目标target = proxy.getTargetSource().getTarget();
  • 然而,这不是 Spring 家伙提倡的方法,因为它是侵入性的。正确配置的 AOP 代理对应用程序是透明的。如果不是,那它就不是真正的 AOP。
  • 我认为他的问题可能是在 AOP 中您可以代理不实现任何接口的类。所以 AOP 从一开始就打破了代理规则。
  • @hakish 如何获取变量“proxy”?当我执行 myAutowiredBean.getTargetSource() 时,它显示“无法解析方法”。
【解决方案2】:

根据目标 bean 的类层次结构,Spring 将生成一个扩展目标 bean 类的代理(使用 CGLIB),或者生成一个仅实现目标 bean 接口的代理。

如果您的目标 bean 实现了任何接口,则将选择后一个选项。这通常是优选的。我猜你的目标类确实实现了至少一个接口。您的获取 bean 的代码能否将引用转换为接口类型而不是类?

但是,您可以使用 proxy-target-class 选项强制 Spring AOP 生成扩展目标 bean 类的代理。确切的语法取决于您如何配置 AOP,并且您没有在问题中指定这一点。

【讨论】:

  • 我可以使用 org.springframework.aop.framework.Advised 类解决我的问题。这使我能够访问作为实际 bean 本身的目标类。感谢您的投入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多