Spring ApplicationContext.getBean(Class c)不适用于代理类

时间:2012-07-18 06:33:53

标签: java spring proxy applicationcontext

我需要通过类类型查找bean。当bean被代理包装时(某些方法是@Transactional) - ApplicatoinContext无法找到它们。我发现如果我通过接口查找它们,它可以工作,但在这种情况下我正在使用具体的类类型。我知道bean是我正在寻找的类型,但getBean()方法失败。

我可以调试(并修复)Spring的AbstractBeanFactory代码中的问题。问题是它根据我要请求的类型检查beanInstance的类型,但beanInstance.getClass()是一个代理。 AbstractBeanFactory应该对此进行补偿,并将类型与代理的目标类进行比较。

我有一个修复此问题,但我并不特别想使用修补版本的Spring,我怀疑必须有一些东西我可以配置来使这个工作,或者这真的是一个错误?

2 个答案:

答案 0 :(得分:12)

Spring实现AOP有两种主要方式(例如@Transactional支持):使用代理接口或CGLIB。

使用接口(默认)如果您的类实现任何接口,Spring将创建一个实现所有接口的代理。从现在开始,您只能通过该接口使用您的bean。你的班级深陷其中。

如果您通过启用代理目标类:

<aop:config proxy-target-class="true">

Spring将创建一个子类(obvoiusly仍然实现所有接口)。这将解决您的问题。但请记住,返回的对象实际上不是您的类,而是动态生成的子类,它包装并委托给您的原始对象。在大多数情况下,这应该不是问题。

不,当然这不是一个bug,而是众所周知的行为,不,没有必要修补Spring。

另见

答案 1 :(得分:1)

<context:component-scan base-package="<Your base package name goes here>" />
<aop:aspectj-autoproxy />
<aop:config proxy-target-class="true"/>

在applicationContext.xml中写下这三行,这对我有用。