【发布时间】:2014-11-17 18:16:28
【问题描述】:
我正在尝试解决 spring 不使用 factoryBean 的一些问题。我已插入调试器并证明故障出在 AbstraceBeanFactory 的这一行:
if(!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
return beanInstance;
}
特别是“beanInstance instanceof FactoryBean”部分在它应该为真时返回假,导致我返回一个 factorybean 而不是工厂应该构造的 bean。
我的调试器清楚地告诉我 beanInstance 是一个 org.springframework.beans.factory.config.PropertiesFactoryBean。当我告诉 eclipse 扩展 bean 的类时,我看到它清楚地实现了 FactoryBean
为了进一步测试,我去了表达式。假设表达式:
beanInstance instanceof org.springframework.beans.factory.config.PropertiesFactoryBean
返回假。但是 beanInstance.getClass() 返回
(org.springframework.beans.factory.config.PropertiesFactoryBean) (id=112)
看来我的虚拟机对这个类很困惑。我正在尝试找出导致这种混乱的原因,以及如何解决它?
最可能的情况似乎是多个类加载器之间的混淆,但我没有找到任何明显的例子。我的类路径中应该只有一个 PropertiesFactoryBean 实现。
什么会导致 instanceof 以这种方式失败?我怎样才能找到我的根本原因?
顺便说一句,如果相关的话,这最终是我正在调试的一个 tomcat 实例。另外,beanInstance 是一个 instanceof 对象,所以 intanceof 有时确实可以正常工作。
ps。我不得不手动输入,而不是复制/粘贴。请假设任何明显的命名错误都是我的拼写错误。
编辑:修复了 cmets 中提到的括号错字。我想我会那样做。这段代码来自 Spring 未经我修改,因此可以安全地假设代码本身编写得很好且功能齐全,即使我确实打错了
【问题讨论】:
-
你知道你有
!,对吧? -
还有放错位置的括号。
-
beanInstance的类加载器和FactoryBean的类加载器一样吗?
-
您能否检查表达式
class.forName("org.springframework.beans.factory.config.PropertiesFactoryBean")是否返回与beanInstance.getClass()相同的ID? -
我知道有一个!那里。问题是 beanInstance 实现了 FactoryBean,由于 !.但是,它正在返回,因为 instanceof 检查返回的是 false 而不是 true。
标签: java spring classloader instanceof