我试图寻找一些弹簧,而不用花费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是Object的instanceof,因此intanceof有时确实可以正常工作。
ps。我必须手动输入,而不是复制/粘贴。请假设任何明显的命名错误都是我的错别字。
编辑:修复注释中提到的括号错误。我想我会做到的。这段代码来自我未经修改的Spring,因此可以安全地假设代码本身写得很好并且可以正常工作,即使我确实打错了
如果您有多个Web应用程序(或在使用Tomcat的热部署功能的情况下,同一个Web应用程序有多个版本),则每个Web应用程序将拥有自己的类加载器,以及另一个用于加载Tomcatlib
文件夹中所有内容的类加载器(该加载器是Tomcat的父级)其他类加载器)。
因此,如果您要检查的界面在您的战争内部(或战争所部署的库中),并且您已部署了多个Web应用程序(可能其中一些已取消部署,但对对象的引用仍然存在),则假定它是一个类加载器问题(尤其是您已经确认getClass()
在实例上Class.forName
返回了不同的对象。请同时调用getClassLoader
这两个类对象(Tomcat的类加载器具有好的toString
方法)),并且您可能知道它们来自哪个类加载器/ webapp。
可能的短期解决方法是将包含接口的jar移到的外面,war
并将其放入tomcat的lib
文件夹中。
长期修复是为了找出根本原因并进行修复,当然:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句