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

2023-12-30

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

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

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


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

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

如果您通过启用代理目标类cglib /questions/tagged/cglib:

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

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

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

See also

  • Spring AOP生成的代理类的位置 https://stackoverflow.com/questions/11520330
  • Jenkins 中出现 Spring 错误“名为 'x' 的 Bean 必须属于 [y] 类型,但实际上属于 [$Proxy] 类型” https://stackoverflow.com/questions/8391944
  • 如何在 Spring 配置文件中混合使用 CGLIB 和 JDK 代理? https://stackoverflow.com/questions/10110569
  • 模拟 CGLIB 代理服务的属性不起作用 https://stackoverflow.com/questions/9033874
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring ApplicationContext.getBean(Class c) 不适用于代理类 的相关文章

随机推荐