2010-10-04 2 views
4

Pouvez-vous m'éclairer sur ce problème que j'ai rencontré lors de mes expériences avec Spring?Nom du haricot de printemps lors de l'importation d'un autre contexte de ressort

J'ai 2 contexte ici. nous allons les nommer springA.xml et 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> 

Et ceci est mon fichier 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()); 
} 

Et le résultat, je reçois un "java.lang.String java.lang.String". Si je change la position de le nom "nom2, NAME3" à "NAME3, nom2" (springC.xml), je reçois un "java.lang.Object java.lang.Object".

Je suis juste confus quant à la raison pour laquelle le résultat est comme ça. Je m'attendais à ce que la fonction renvoie java.lang.String pour name2 et java.lang.Object pour name3 (puisque name2 est déjà utilisé dans springA.xml, je suppose que ce nom ne sera pas utilisé et utilisera plutôt name3 pour springB.xml)

Merci!

PS: Spring 2.5 Eclipse 3.5

+0

Que voulez-vous dire "changer la position de"? S'il vous plaît nous montrer les deux différentes méthodes 'main', plutôt que de décrire les différences. – skaffman

+0

J'ai ajouté springC.xml. J'espère que cela peut vous aider à mieux comprendre le problème. – qaxi

+0

Pas vraiment, non. – skaffman

Répondre

0

J'ai couru votre code sur Spring 2.5.6 et 3.0.0.M1 et les deux versions produisent le même résultat.

java.lang.String java.lang.String

Mon conseil est que si vous voulez deux chaînes et vous obtenez des résultats étranges avec 2,5, puis à bosse 2.5.6 ou 3.0.0.M1.

+0

est-ce un bug au printemps? – qaxi

+0

Même si j'attache la version printemps à 2.5, je n'obtiens pas vos résultats. Je reçois toujours String String comme sortie avec l'un ou l'autre contexte. Donc je le ferais non, ce n'est pas un bug de printemps. –

+0

@qaxi J'ai vérifié cela avec Spring 2.5.6, 2.5.5, 2.5.3, 2.0.7 et ils ont tous renvoyé java.lang.String java.lang.String. Je pense que quelque chose ne va pas avec votre configuration. –

1

De la documentation Spring:

Chaque haricot a un ou plusieurs ids (également appelés identificateurs ou noms, ces termes se réfèrent à la même chose). . Ces ids doivent être uniques dans le BeanFactory ou ApplicationContext le haricot est hébergé dans

Selon cette étude, le contexte de votre application combinée est invalide car il contient deux grains différents qui ont le même ID - bean nommé "name2" de ContextA.xml et votre bean nommé "name2", aliasé "name3" dans ContextC.xml. Je m'attendrais à ce que le printemps émette au moins un avertissement à ce sujet.

Pour répondre à votre question: Vous ne devriez pas attendre des résultats sensés de ce type d'installation. Les noms de bean doivent être uniques et s'ils ne le sont pas, les résultats ne sont pas définis.Et par "indéfini" je veux dire "peu susceptible d'être utile" :)

Espérons que cela aide.

1

Je crois que vous voyez des résultats différents parce que Spring charge les haricots dans le contexte dans différents ordres dans chaque scénario. Spring ne garantit pas l'ordre dans lequel il chargera ses haricots, sauf le fait que tous les beans utilisés comme "ref" dans d'autres définitions de beans seront chargés avant les beans qui en dépendent. La solution correcte à votre problème est NE PAS utiliser des identifiants de beans dupliqués et vous n'aurez pas à deviner quel haricot vous obtiendrez lorsque vous en rechercherez un.

Questions connexes