导入另一个spring上下文时的Spring bean名称

时间:2010-10-04 09:28:18

标签: java spring

你可以告诉我在尝试使用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

3 个答案:

答案 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。