Gibt es einen Unterschied zwischen der Verwendung eines id
Attributs und eines name
Attributs für ein <bean>
Element in einer Spring-Konfigurationsdatei?
Gibt es einen Unterschied zwischen der Verwendung eines id
Attributs und eines name
Attributs für ein <bean>
Element in einer Spring-Konfigurationsdatei?
Antworten:
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 id
entspricht das Attribut den XML-ID-Attributstandards, name
ist jedoch etwas flexibler. Generell benutze ich so name
ziemlich ausschließlich. Es scheint nur mehr "Spring-y".
Seit Spring 3.1 ist das id
Attribut ein xsd:string
und erlaubt den gleichen Zeichenbereich wie dasname
Attribut.
Der einzige Unterschied zwischen a id
und a name
besteht darin, dass a name
mehrere 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.
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 id
und name
stattdessen die Bean bereitstellen .
Das name
Attribut hilft auch beim Definieren von alias
es für Ihre Bean, da es die Angabe mehrerer Bezeichner für eine bestimmte Bean ermöglicht.
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
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" />
Beide id
und name
sind Bean-IDs im Spring IOC-Container / ApplicationContecxt. Mit dem id
Attribut können Sie genau eine ID angeben, aber mit dem name
Attribut können Sie dieser Bean einen Aliasnamen geben.
Sie können die Feder überprüfen doc hier.