Existe-t-il une différence entre l'utilisation d'un id
attribut et l' name
attribut sur un <bean>
élément dans un fichier de configuration Spring?
Existe-t-il une différence entre l'utilisation d'un id
attribut et l' name
attribut sur un <bean>
élément dans un fichier de configuration Spring?
Réponses:
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' id
attribut est conforme aux normes d'attribut XML id alors qu'il name
est un peu plus flexible. D'une manière générale, j'utilise à name
peu près exclusivement. Cela semble plus "Spring-y".
Depuis Spring 3.1, l' id
attribut est un xsd:string
et autorise la même plage de caractères que l' name
attribut.
La seule différence entre an id
et a name
est que a name
peut contenir plusieurs alias séparés par une virgule, un point-virgule ou un espace, tandis que an id
doit ê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.
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 id
et fournir le bean à la name
place.
L' name
attribut aide également à définir alias
es pour votre bean, car il permet de spécifier plusieurs identifiants pour un bean donné.
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
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" />
Les deux id
et name
sont des identificateurs de bean dans le conteneur Spring IOC / ApplicationContecxt. L' id
attribut vous permet de spécifier exactement un identifiant mais en utilisant l' name
attribut, vous pouvez donner un nom d'alias à ce bean.
Vous pouvez consulter la doc du printemps ici.