不知道大家的项目中有没有遇见过这种情况。
项目中总共有A.B.C三个module。A有三个spring配置文件,分别叫做bean.xml,service.xml,db.xml。然后B有两个配置文件,分别叫做service.xml,bean.xml。然后启动项目,spring加载时却发现本在A的service.xml中定义的serviceForA死活实例化不了。而且即使你把serviceForA的配置删掉,并且把项目中引用到的地方全部删掉,又会发现spring报service.xml中有别的bean无法实例化。
最近我就遇见了这种近乎无解的问题。最后发现引起这种问题可能的原因是,spring为A实例化bean,事实上却没有加载A下面的service.xml,而是加载了B下面的service.xml!!!!我当时解压了项目A打成的jar包,发现A项目下的service.xml文件内容与IDE里的内容完全不一样,反而是和B的service.xml长得一样。
深层次分析原因,发现A项目的pom.xml中添加了对B项目的依赖,所以可能spring在加载配置文件的时候,因为对B有依赖,所以决定先去实例化B的bean,先读取到了B项目下面的service.xml文件,然后放到了A的配置文件集合(这是我自己YY的一个概念)中,等读到A项目下的service.xml后,发现已经存在一个名为service.xml的文件,于是不再加载A下面本来的service.xml。于是导致了这个坑了我三天的问题。
解决方案很简单,就是把A项目的service.xml给改个名字,改成serice-A.xml后,重新打包,再去解压jar包,发现config/spring/下果然多了个service-A.xml,讽刺的是service.xml依然安安静静地躺在那。╮(╯▽╰)╭
总之,得到的教训是尽量不要起重复名字的配置文件,即使这两个文件放在不同的module中!