Spring AOP - 如何将代理对象转换为原始对象?

3

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

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

有没有办法可以获取实际的bean?

applicationContext.xml

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

some.java

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

这会抛出以下异常:

java.lang.ClassCastException: $Proxy19


你可以提供这个Bean的Spring配置吗? - dfa
<tx:advice id="txAdvice" transaction-manager="someTransactionManager"> tx:attributes<tx:method name="call*" />tx:attributes<aop:pointcut id="concurrentProcessOperation" expression="execution(* java.util.concurrent.Callable.*(..))" />aop:config <aop:advisor advice-ref="txAdvice" pointcut-ref="concurrentProcessOperation" /> </aop:config> - hakish
'abc' 是一个具体类还是接口? - Gandalf
2个回答

3

首先,您需要将其转换为代理对象。然后尝试以下操作:

Proxy.getTargetSource().getTarget

我不确定这是否有效,AOP文档在描述代理类的返回类型时非常模糊,它说一些像“返回

”这样的话。

3
谢谢,你的解决方案部分正确。org.springframework.aop.framework.Advised类可以解决问题。将代理转换为Advised类型: Advised advised = (Advised) proxy; 获取目标对象: Target target = proxy.getTargetSource().getTarget(); - hakish
这不是Spring开发人员提倡的方法,因为它是侵入性的。正确配置的AOP代理对应用程序是透明的。如果不是这样,那么它就不是真正的AOP。 - skaffman
我认为他的问题之一可能是AOP中可以代理不实现任何接口的类。因此,AOP从一开始就违反了代理规则。 - Gandalf
@hakish 我怎样获取变量“proxy”?当我执行myAutowiredBean.getTargetSource()时,它会显示“无法解析方法”。 - flow2k

2

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

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

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


我可以使用org.springframework.aop.framework.Advised类解决我的问题。 这使我能够访问目标类,即实际的bean本身。 感谢您的输入。 - hakish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接