你可以告诉我在尝试使用Spring时遇到的这个问题。
我这里有2个上下文。让我们将它们命名为springA.xml和springB.xml
springA.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="springB.xml" />
<bean name="name2" class="java.lang.String"/>
</beans>
springB.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="name2,name3" class="java.lang.String"/>
</beans>
springC.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="name3,name2" class="java.lang.String"/>
</beans>
这是我的Java文件。
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("springA.xml"));
Object obj1 = factory.getBean("name2");
Object obj2 = factory.getBean("name3");
System.out.println(obj1.getClass().getName() + " " + obj2.getClass().getName());
}
结果,我得到一个“java.lang.String java.lang.String”。如果我改变了位置 名称“name2,name3”到“name3,name2”( springC.xml ),我得到一个“java.lang .Object java.lang.Object“。
我很困惑为什么结果是这样的。我期望该函数将返回name2的java.lang.String和name3的java.lang.Object(因为name2已经在springA.xml中使用,我假设不会使用此名称,而是使用name3 for springB.xml)
谢谢!
PS: 春天2.5 Eclipse 3.5
答案 0 :(得分:1)
来自Spring的文档:
每个bean都有一个或多个id(也是 被称为标识符或名称;这些 术语指同一件事)。这些 id必须是唯一的 BeanFactory或ApplicationContext bean托管在。
根据这个,你的组合应用程序上下文是无效的,因为它包含两个具有相同ID的不同bean - 来自ContextA.xml的名为“name2”的bean和名为“name2”的bean,在ContextC中别名为“name3”。 XML。我希望Spring至少发出一个警告。
回答你的问题:你不应该期望这种设置有任何明智的结果。 Bean名称必须是唯一的,如果不是,则结果未定义。而“未定义”我的意思是“不太可能有所帮助”:)
希望这有帮助。
答案 1 :(得分:1)
我相信你会看到不同的结果,因为Spring在每个场景中以不同的顺序加载bean。 Spring不保证它将加载它的bean的顺序除了在其他bean定义中用作“ref”的任何bean将在依赖它们的bean之前加载的事实。
问题的正确解决方案是不要使用重复的bean标识符,然后你就不必猜测你在查找它时会得到哪个bean。
答案 2 :(得分:0)
我在Spring 2.5.6和3.0.0.M1上运行了你的代码,两个版本产生相同的结果。
java.lang.String java.lang.String
我的建议是,如果你想要两个字符串,你会得到2.5的奇怪结果,然后碰到2.5.6或3.0.0.M1。