Différence entre l'utilisation de l'ID et du nom du bean dans le fichier de configuration Spring

205

Existe-t-il une différence entre l'utilisation d'un idattribut et l' nameattribut sur un <bean>élément dans un fichier de configuration Spring?

Duncan Jones
la source
8
il est difficile de trouver des questions aussi simples et des réponses aussi simples et complètes. Génial. Merci!
Peter Perháč

Réponses:

129

D'après la référence Spring , 3.2.3.1 Nommage des beans :

Chaque bean possède un ou plusieurs identifiants (également appelés identifiants ou noms; ces termes se réfèrent à la même chose). Ces identifiants doivent être uniques dans le conteneur dans lequel le bean est hébergé. Un bean n'aura presque toujours qu'un seul identifiant, mais si un bean a plusieurs identifiants, les supplémentaires peuvent essentiellement être considérés comme des alias.

Lorsque vous utilisez des métadonnées de configuration basées sur XML, vous utilisez les attributs 'id' ou 'name' pour spécifier le ou les identifiants du bean. L'attribut 'id' vous permet de spécifier exactement un id, et comme il s'agit d'un véritable attribut d'ID d'élément XML, l'analyseur XML est capable de faire une validation supplémentaire lorsque d'autres éléments font référence à l'id; en tant que tel, c'est la manière préférée de spécifier un identifiant de bean. Cependant, la spécification XML limite les caractères autorisés dans les ID XML. Ce n'est généralement pas une contrainte, mais si vous avez besoin d'utiliser l'un de ces caractères XML spéciaux ou si vous souhaitez introduire d'autres alias dans le bean, vous pouvez également ou à la place spécifier un ou plusieurs identifiants de bean, séparés par une virgule (, ), point-virgule (;) ou espace dans l'attribut 'nom'.

Donc, fondamentalement, l' idattribut est conforme aux normes d'attribut XML id alors qu'il nameest un peu plus flexible. D'une manière générale, j'utilise à namepeu près exclusivement. Cela semble plus "Spring-y".

cletus
la source
46
Vous préférez utiliser l'attribut "nom" même si la référence Spring que vous avez citée recommande d'utiliser l'attribut "id"? Même si vous préférez bâton avec « nom », vous ne pouvez pas l' appeler plus « Spring-y » si la référence Spring suggère le contraire :) Ceci est pinailler, je sais;)
theadam
77

Depuis Spring 3.1, l' idattribut est un xsd:stringet autorise la même plage de caractères que l' nameattribut.

La seule différence entre an idet a nameest que a namepeut contenir plusieurs alias séparés par une virgule, un point-virgule ou un espace, tandis que an iddoit être une valeur unique.

À partir de la documentation de Spring 3.2:

Dans les métadonnées de configuration basées sur XML, vous utilisez les attributs id et / ou name pour spécifier le ou les identificateurs de bean. L'attribut id vous permet de spécifier exactement un identifiant. Classiquement, ces noms sont alphanumériques ('myBean', 'fooService', etc.), mais peuvent également contenir des caractères spéciaux. Si vous souhaitez introduire d'autres alias dans le bean, vous pouvez également les spécifier dans l'attribut name, séparés par une virgule (,), un point-virgule (;) ou un espace blanc. Comme note historique, dans les versions antérieures à Spring 3.1, l'attribut id était tapé comme un xsd: ID, ce qui contraignait les caractères possibles. Depuis 3.1, il s'agit désormais de xsd: string. Notez que l'unicité de l'ID de bean est toujours appliquée par le conteneur, mais plus par les analyseurs XML.

Duncan Jones
la source
48

L'un ou l'autre fonctionnerait. Cela dépend de vos besoins:
si votre identifiant de bean contient des caractères spéciaux, par exemple ( /viewSummary.html), il ne sera pas autorisé en tant que bean id, car ce n'est pas un ID XML valide. Dans de tels cas, vous pouvez ignorer la définition du bean idet fournir le bean à la nameplace.
L' nameattribut aide également à définir aliases pour votre bean, car il permet de spécifier plusieurs identifiants pour un bean donné.

pugmarx
la source
4
Plus un pour le dire avec vos propres mots et donner un exemple pourquoi des caractères spéciaux peuvent être nécessaires.
Michael Piefel
Je vous remercie. Je l'apprécie.
pugmarx
3

Y a-t-il une différence entre l'utilisation d'un attribut id et d'un attribut name sur une balise <bean>

Il existe peu de différences mineures, comme l'utilisation de id lèvera une exception s'il n'est pas géré correctement.
permettez-moi de répondre à la question ci-dessous

Existe-t-il une différence entre l' utilisation d'un attribut id et l' utilisation d'un attribut name sur une balise <bean>,

Il n'y a pas de différence. vous ressentirez le même effet lorsque id ou nom est utilisé sur une balise <bean>.

Comment?

Les attributs id et name nous donnent tous deux un moyen de fournir une valeur d'identifiant à un bean (pour l'instant, pensez que id signifie id mais pas identifiant). Dans les deux cas, vous verrez le même résultat si vous appelez applicationContext.getBean("bean-identifier"); .

Prenez @Bean, l'équivalent java de la balise <bean>, vous ne trouverez pas d'attribut id. vous pouvez donner votre valeur d'identifiant à @Bean uniquement via l'attribut name.

Permettez-moi de l'expliquer à travers un exemple:
Prenez ce fichier de configuration, appelons-le comme spring1.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
  <bean id="foo" class="com.intertech.Foo"></bean>
  <bean id="bar" class="com.intertech.Bar"></bean>
</beans>

Retourne Spring objet Foo pour, Foo f = (Foo) context.getBean("foo"); . Remplacez id="foo"par name="foo"dans le print1.xml ci-dessus, vous verrez toujours le même résultat.

Définissez votre configuration xml comme,

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
  <bean id="fooIdentifier" class="com.intertech.Foo"></bean>
  <bean name="fooIdentifier" class="com.intertech.Foo"></bean>
</beans>

Vous obtiendrez BeanDefinitionParsingException. Il dira que le nom du bean 'fooIdentifier' est déjà utilisé dans cet élément. Par ailleurs, c'est la même exception que vous verrez si vous avez ci-dessous la configuration
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </bean>
<bean name = "fooIdentifier" class = "com. intertech.Foo "> </bean>


Si vous conservez à la fois l'identifiant et le nom dans la balise du bean, le bean aurait 2 identifiants. vous pouvez obtenir le même bean avec n'importe quel identifiant. prenez config comme

<?xml version="1.0" encoding="UTF-8"?><br>
<beans ...>
  <bean id="fooById" name="fooByName" class="com.intertech.Foo"></bean>
  <bean id="bar" class="com.intertech.Bar"></bean>
</beans>

le code suivant s'imprime vrai

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(...);
Foo fooById = (Foo) context.getBean("fooById")// returns Foo object;
Foo fooByName = (Foo) context.getBean("fooByName")// returns Foo object;
System.out.println(fooById == fooByName) //true
Swaroop
la source
1

Existe-t-il une différence dans la définition de l'identifiant et du nom dans le fichier XML ApplicationContext? Non Depuis la version 3.1 (spring), id est également défini comme un type de chaîne xsd :. Cela signifie que tous les caractères autorisés dans la définition du nom sont également autorisés dans Id. Cela n'était pas possible avant le printemps 3.1.

Pourquoi utiliser le nom quand il est identique à l'ID? Il est utile dans certaines situations, comme autoriser chaque composant d'une application à faire référence à une dépendance commune en utilisant un nom de bean spécifique à ce composant lui-même.

For example, the configuration metadata for subsystem A may refer to a DataSource via the name subsystemA-dataSource. The configuration metadata for subsystem B may refer to a DataSource via the name subsystemB-dataSource. When composing the main application that uses both these subsystems the main application refers to the DataSource via the name myApp-dataSource. To have all three names refer to the same object you add to the MyApp configuration metadata the following 

<bean id="myApp-dataSource" name="subsystemA-dataSource,subsystemB-dataSource" ..../>

Alternatively, You can have separate xml configuration files for each sub-system and then you can make use of
alias to define your own names.

<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />
user3202413
la source
0

Les deux idet namesont des identificateurs de bean dans le conteneur Spring IOC / ApplicationContecxt. L' idattribut vous permet de spécifier exactement un identifiant mais en utilisant l' nameattribut, vous pouvez donner un nom d'alias à ce bean.

Vous pouvez consulter la doc du printemps ici.

chirag soni
la source