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

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

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

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

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

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

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

  

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

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

也可以看看

  • Spring AOP生成的代理类的位置
  • 获取Spring错误“Bean命名为’x’必须是[y]类型,但实际上是Jenkins类型[$ Proxy]”
  • 如何在Spring配置文件中混合使用CGLIB和JDK代理?
  • 模拟CGLIB代理服务的属性不起作用
    

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