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

Ale*_*den 8 java proxy spring applicationcontext

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

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

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

Tom*_*icz 13

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

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

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

<aop:config proxy-target-class="true">
Run Code Online (Sandbox Code Playgroud)

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

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

也可以看看