2010-10-04 33 views
4

您可以指导我在试验Spring时遇到的这个问题。导入另一个弹簧上下文时的Spring bean名称

我在这里有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: Spring 2.5的 的Eclipse 3.5

+0

你是什么意思“改变位置”?请向我们展示两种不同的“主要”方法,而不是描述差异。 – skaffman 2010-10-04 09:40:16

+0

我加了springC.xml。我希望这可以帮助你更多地理解问题。 – qaxi 2010-10-04 09:47:30

+0

不是,不。 – skaffman 2010-10-04 10:08:22

回答

0

我已经跑了春季2.5.6和3.0.0.M1您的代码,这两个版本产生相同的结果。

java.lang.String中java.lang.String中

我的建议是,如果你想两个字符串,然后你用2.5得到奇怪的结果,然后撞击到2.5.6或3.0.0.M1。

+0

这是一个在春季的错误? – qaxi 2010-10-07 13:08:08

+0

即使我把春天的版本降到2.5,我也没有得到你的结果。我总是将字符串字符串作为具有任一上下文的输出。所以我会这么说,这不是一个春天的bug。 – 2010-10-07 15:35:54

+0

@qaxi我用Spring 2.5.6,2.5.5,2.5.3,2.0.7检查了它,它们都返回java.lang.String java.lang.String。我认为你的配置有问题。 – 2010-10-26 16:44:07

1

从Spring的文档:

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

根据这一点,您的组合应用程序上下文是无效的,因为它包含有相同的ID两个不同的豆类 - 你的bean命名来自ContextA.xml的“name2”和名为“name2”的bean,在ContextC.xml中使用别名“name3”。我希望春季至少对此发出警告。

要回答你的问题:你不应该期待这种设置的任何理智的结果。 Bean名称必须是唯一的,如果它们不是,则结果是未定义的。而“未定义”我的意思是“不太可能有帮助”:) :)

希望这有助于。

1

我相信你会看到不同的结果,因为Spring在每个场景中以不同顺序在上下文中加载bean。 Spring并不保证它将加载它的bean的顺序,除了在其他bean定义中用作“ref”的bean将被加载到依赖它们的bean之前之前。

正确的解决方案是你的问题不要使用重复的bean标识符,然后你将不必猜测当你看起来你会得到哪个bean。

相关问题