Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 导入另一个Spring上下文时的Spring bean名称_Java_Spring - Fatal编程技术网

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

Java 导入另一个Spring上下文时的Spring bean名称,java,spring,Java,Spring,你能告诉我在试验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.sprin

你能告诉我在试验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>
<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>
<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.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用于springB.xml)

谢谢

附言: 春季2.5
Eclipse3.5

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

java.lang.String java.lang.String


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

来自Spring的文档:

每个bean都有一个或多个ID(也有 称为标识符或名称;这些 术语指的是同一事物)。这些 ID在系统中必须是唯一的 BeanFactory或应用程序上下文 bean托管在中

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

回答您的问题:您不应该期望这种设置会产生任何正常的结果。Bean名称必须是唯一的,如果不是唯一的,则结果是未定义的。“未定义”是指“不太可能有帮助”:


希望这能有所帮助。

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


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

什么是“更改的位置”?请向我们展示两种不同的
main
方法,而不是描述它们的区别。我希望这能帮助你更好地理解这个问题。即使我把spring版本限制在2.5,我也不会得到你的结果。我总是将字符串作为任何上下文的输出。所以我会说不,这不是一个spring bug。@qaxi我用spring 2.5.6、2.5.5、2.5.3、2.0.7检查了这个问题,他们都返回了java.lang.String java.lang.String。我认为您的配置有问题。
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());
}