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

4

能否帮我解决在尝试使用Spring时遇到的问题呢?

我这里有两个上下文,我们称它们为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中使用,我假设这个名称不会被使用,而是使用springB.xml的name3)。
谢谢!
附注:Spring 2.5 Eclipse 3.5

你说的“改变位置”是什么意思?请展示两个不同的main方法,而不是描述它们的区别。 - skaffman
我添加了springC.xml文件。希望这可以帮助您更好地理解问题。 - qaxi
3个回答

1

来自Spring文档:

每个bean都有一个或多个ID(也称为标识符或名称;这些术语指的是同一件事)。这些ID必须在BeanFactory或ApplicationContext中唯一,其中bean托管。

根据此,您的组合应用程序上下文无效,因为它包含两个具有相同ID的不同bean - 您从ContextA.xml命名为“name2”的bean和您从ContextC.xml别名为“name3”的bean命名为“name2”。我希望Spring至少会发出警告。

回答您的问题:您不应该期望从这种设置中获得任何明智的结果。 Bean名称必须是唯一的,如果它们不是,则结果未定义。通过“未定义”,我意味着“不太可能有帮助” :)

希望这可以帮到您。


1

我相信你看到不同的结果是因为Spring在每种情况下以不同的顺序加载上下文中的bean。Spring不能保证它将以哪种顺序加载它的bean,除了任何用作其他bean定义中“ref”的bean将在依赖于它们的bean之前加载。

你问题的正确解决方案是不要使用重复的bean标识符,这样当你查找一个bean时就不必猜测会得到哪个bean了。


0

我已经在Spring 2.5.6和3.0.0.M1上运行了您的代码,两个版本都产生了相同的结果。

java.lang.String java.lang.String

我的建议是,如果您想要两个字符串,并且在2.5中得到了奇怪的结果,请升级到2.5.6或3.0.0.M1。


即使我将Spring版本固定在2.5,也不能得到您的结果。我总是得到String String作为任何上下文的输出。因此,我认为这不是Spring的bug。 - dom farr
@qaxi 我已经使用Spring 2.5.6、2.5.5、2.5.3和2.0.7进行了检查,它们都返回了java.lang.String java.lang.String。我认为你的配置有问题。 - Gary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接