Unterschied zwischen der Verwendung der Bean-ID und des Namens in der Spring-Konfigurationsdatei

205

Gibt es einen Unterschied zwischen der Verwendung eines idAttributs und eines nameAttributs für ein <bean>Element in einer Spring-Konfigurationsdatei?

Duncan Jones
quelle
8
Es ist schwer, Fragen so einfach zu beantworten und Antworten so einfach und umfassend zu beantworten. Toll. Vielen Dank!
Peter Perháč

Antworten:

129

Aus der Spring-Referenz , 3.2.3.1 Benennen von Bohnen :

Jede Bean hat eine oder mehrere IDs (auch als Bezeichner oder Namen bezeichnet; diese Begriffe beziehen sich auf dasselbe). Diese IDs müssen innerhalb des Containers, in dem sich die Bean befindet, eindeutig sein. Eine Bean hat fast immer nur eine ID. Wenn eine Bean jedoch mehr als eine ID hat, können die zusätzlichen IDs im Wesentlichen als Aliase betrachtet werden.

Wenn Sie XML-basierte Konfigurationsmetadaten verwenden, verwenden Sie die Attribute 'id' oder 'name', um die Bean-IDs anzugeben. Mit dem Attribut 'id' können Sie genau eine ID angeben. Da es sich um ein echtes XML-Element-ID-Attribut handelt, kann der XML-Parser eine zusätzliche Überprüfung durchführen, wenn andere Elemente auf die ID verweisen. Daher ist es die bevorzugte Methode, eine Bean-ID anzugeben. Die XML-Spezifikation beschränkt jedoch die Zeichen, die in XML-IDs zulässig sind. Dies ist normalerweise keine Einschränkung. Wenn Sie jedoch eines dieser speziellen XML-Zeichen verwenden müssen oder andere Aliase in die Bean einfügen möchten, können Sie auch oder stattdessen eine oder mehrere Bean-IDs angeben, die durch ein Komma (,) getrennt sind ), Semikolon (;) oder Leerzeichen im Attribut 'name'.

Grundsätzlich identspricht das Attribut den XML-ID-Attributstandards, nameist jedoch etwas flexibler. Generell benutze ich so nameziemlich ausschließlich. Es scheint nur mehr "Spring-y".

Cletus
quelle
46
Sie bevorzugen die Verwendung des Attributs "name", obwohl die von Ihnen angegebene Spring-Referenz die Verwendung des Attributs "id" empfiehlt? Selbst wenn Sie es vorziehen, bei "Name" zu bleiben, können Sie es nicht mehr "Spring-y" nennen, wenn die Spring-Referenz etwas anderes vorschlägt :) Das ist nicht wählerisch, ich weiß;)
Theadam
77

Seit Spring 3.1 ist das idAttribut ein xsd:stringund erlaubt den gleichen Zeichenbereich wie dasname Attribut.

Der einzige Unterschied zwischen a idund a namebesteht darin, dass a namemehrere Aliase enthalten kann, die durch Komma, Semikolon oder Leerzeichen getrennt sind, während anid einzelner Wert sein muss.

Aus der Spring 3.2-Dokumentation:

In XML-basierten Konfigurationsmetadaten verwenden Sie die Attribute id und / oder name, um die Bean-IDs anzugeben. Mit dem ID-Attribut können Sie genau eine ID angeben. Herkömmlicherweise sind diese Namen alphanumerisch ('myBean', 'fooService' usw.), können aber auch Sonderzeichen sein. Wenn Sie der Bean andere Aliase hinzufügen möchten, können Sie diese auch im Attribut name angeben, das durch Komma (,), Semikolon (;) oder Leerzeichen getrennt ist. Als historische Anmerkung wurde in Versionen vor Spring 3.1 das id-Attribut als xsd: ID eingegeben, wodurch mögliche Zeichen eingeschränkt wurden. Ab 3.1 ist es jetzt xsd: string. Beachten Sie, dass die Eindeutigkeit der Bean-ID weiterhin vom Container erzwungen wird, jedoch nicht mehr von XML-Parsern.

Duncan Jones
quelle
48

Entweder würde man arbeiten. Dies hängt von Ihren Anforderungen ab:
Wenn Ihre Bean- ID beispielsweise Sonderzeichen enthält /viewSummary.html, wird sie nicht als Bean zugelassen id, da es sich nicht um eine gültige XML-ID handelt. In solchen Fällen können Sie die Definition der Bean überspringen idund namestattdessen die Bean bereitstellen .
Das nameAttribut hilft auch beim Definieren von aliases für Ihre Bean, da es die Angabe mehrerer Bezeichner für eine bestimmte Bean ermöglicht.

Pugmarx
quelle
4
Plus eins, um es in eigenen Worten zu sagen und ein Beispiel zu geben, warum möglicherweise Sonderzeichen benötigt werden.
Michael Piefel
Danke dir. Bin dankbar.
Pugmarx
3

Gibt es einen Unterschied zwischen der Verwendung eines ID-Attributs und eines Namensattributs für ein <bean> -Tag?

Es gibt nur wenige geringfügige Unterschiede: Wenn die ID verwendet wird, wird eine Ausnahme ausgelöst, wenn sie nicht ordnungsgemäß behandelt wird.
Lassen Sie mich die folgende Frage beantworten

Gibt es einen Unterschied zwischen der Verwendung eines ID- Attributs und der Verwendung eines Namensattributs für ein <bean> -Tag?

Es gibt keinen Unterschied. Der gleiche Effekt tritt auf, wenn ID oder Name für ein <bean> -Tag verwendet werden.

Wie?

Sowohl ID- als auch Namensattribute geben uns die Möglichkeit, einer Bean einen Bezeichnerwert bereitzustellen (In diesem Moment bedeutet denken, dass ID ID, aber kein Bezeichner bedeutet). In beiden Fällen sehen Sie das gleiche Ergebnis, wenn Sie anrufenapplicationContext.getBean("bean-identifier"); .

Nehmen Sie @Bean, das Java-Äquivalent des <bean> -Tags. Sie werden kein ID-Attribut finden. Sie können @Bean Ihren Bezeichnerwert nur über das Namensattribut geben.

Lassen Sie es mich
anhand eines Beispiels erklären: Nehmen Sie diese Konfigurationsdatei und nennen Sie sie 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>

Spring gibt das Foo-Objekt für , Foo f = (Foo) context.getBean("foo"); . Ersetzen Sie id="foo"durch name="foo"in der obigen Datei spring1.xml. Sie werden immer noch das gleiche Ergebnis sehen.

Definieren Sie Ihre XML-Konfiguration wie folgt:

<?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>

Sie erhalten die BeanDefinitionParsingException. In diesem Element wird bereits der Bean-Name 'fooIdentifier' verwendet. Dies ist übrigens dieselbe Ausnahme, die Sie sehen werden, wenn Sie unten config
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </ bean>
<bean name = "fooIdentifier" class = "com haben. intertech.Foo "> </ bean>


Wenn Sie sowohl die ID als auch den Namen für das Bean-Tag beibehalten, hat die Bean zwei Bezeichner. Sie können dieselbe Bean mit jeder Kennung erhalten. Nehmen Sie config as

<?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>

Der folgende Code gibt true aus

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
quelle
1

Gibt es einen Unterschied bei der Definition von ID und Name in ApplicationContext xml? Nein Ab 3.1 (spring) wird id auch als xsd: string-Typ definiert. Dies bedeutet, dass alle Zeichen, die zum Definieren des Namens zulässig sind, auch in der ID zulässig sind. Dies war vor Frühjahr 3.1 nicht möglich.

Warum sollte der Name verwendet werden, wenn er mit der ID identisch ist? Dies ist in einigen Situationen hilfreich, z. B. wenn Sie zulassen, dass jede Komponente in einer Anwendung auf eine allgemeine Abhängigkeit verweist, indem Sie einen Bean-Namen verwenden, der für diese Komponente selbst spezifisch ist.

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
quelle
0

Beide idund namesind Bean-IDs im Spring IOC-Container / ApplicationContecxt. Mit dem idAttribut können Sie genau eine ID angeben, aber mit dem nameAttribut können Sie dieser Bean einen Aliasnamen geben.

Sie können die Feder überprüfen doc hier.

Chirag Soni
quelle