我正在尝试用Spring来解决一些问题,而不是花费一个factoryBean。我已插入调试器并证明失败在AbstraceBeanFactory的这一行:
if(!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
return beanInstance;
}
具体来说,“beanInstance instanceof FactoryBean”部分在应该为true时返回false,导致我返回一个factorybean而不是工厂假设要构造的bean。
我的调试器清楚地告诉我beanInstance是一个org.springframework.beans.factory.config.PropertiesFactoryBean。当我告诉eclipse扩展bean的类时,我看到它清楚地实现了FactoryBean
为了进一步测试,我去了表达式。据说是表达式:
beanInstance instanceof org.springframework.beans.factory.config.PropertiesFactoryBean
返回false。但是beanInstance.getClass()返回
(org.springframework.beans.factory.config.PropertiesFactoryBean) (id=112)
看来我的VM对这门课很困惑。我想弄清楚会导致这种混乱的原因,以及我如何解决它?
最可能的情况似乎是多个类加载器的混淆,但我没有找到任何明显的例子。我的类路径中应该只有一个PropertiesFactoryBean实现。
什么会导致instanceof以这种方式失败?我怎样才能找到根本原因?
顺便说一句,这最终是我正在调试的tomcat实例,如果它是相关的。此外,beanInstance 是一个Objectof的实例,因此intanceof有时可以正常工作。
PS。我不得不手工输入,而是复制/粘贴。请假设任何明显的命名错误都是我的错误。
编辑:修复了评论中提到的paren拼写错误。我想我会这样做。这段代码来自Spring,我没有修改过,因此可以安全地假设代码本身编写得很好并且功能正常,即使我确实输错了
答案 0 :(得分:0)
如果你有多个webapp(或者同一个webapp的多个版本,以防你使用Tomcat的热门部署功能),每个webapp都有自己的类加载器,还有另一个加载所有东西的类加载器Tomcat的lib
文件夹(是其他类加载器的父文件夹)。
因此,如果您正在检查的接口位于您的战争中(或者在您的战争部署的lib中),并且您部署了多个Web应用程序(可能其中一些已经取消部署,但某些对象的引用保持活动状态),请假设它是一个类加载器问题(特别是当您已确认实例上的getClass()
和Class.forName
返回不同的对象时。在两个类对象上调用getClassLoader
(Tomcat的类加载器具有良好的toString
{1}}方法)并且可能你知道它们来自哪个类加载器/ webapp。
可能短期修复是将包含接口的jar移到war
之外并将其放入tomcat的lib
文件夹中。
长期解决方法是追踪根本原因并修复它,当然:)