8

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

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

我对此有一个修复,但我不是特别想使用 Spring 的补丁版本,我怀疑我必须配置一些东西才能让它工作,或者这真的是一个错误吗?

4

2 回答 2

14

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

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

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

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

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

不,这当然不是错误,而是众所周知的行为,不,不需要修补 Spring。

也可以看看

于 2012-07-18T06:45:30.383 回答
1
<context:component-scan base-package="<Your base package name goes here>" />
<aop:aspectj-autoproxy />
<aop:config proxy-target-class="true"/>

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

于 2012-07-18T12:16:42.063 回答