Różnica między użyciem identyfikatora i nazwy komponentu bean w pliku konfiguracyjnym Spring

205

Czy jest jakaś różnica między użyciem idatrybutu i nameatrybutu dla <bean>elementu w pliku konfiguracyjnym Spring?

Duncan Jones
źródło
8
trudno jest znaleźć tak proste pytania, a odpowiedzi tak proste i wyczerpujące. Wspaniały. Dzięki!
Peter Perháč

Odpowiedzi:

129

Ze źródła Spring , 3.2.3.1 Naming Beans :

Każda fasola ma jeden lub więcej identyfikatorów (zwanych także identyfikatorami lub nazwami; te terminy odnoszą się do tej samej rzeczy). Te identyfikatory muszą być unikalne w kontenerze, w którym jest przechowywana fasola. Fasola prawie zawsze ma tylko jeden identyfikator, ale jeśli fasola ma więcej niż jeden identyfikator, dodatkowe można zasadniczo uznać za aliasy.

Korzystając z metadanych konfiguracyjnych opartych na XML, używasz atrybutów „id” lub „name”, aby określić identyfikatory identyfikatora komponentu bean. Atrybut „id” umożliwia określenie dokładnie jednego identyfikatora, a ponieważ jest to prawdziwy atrybut identyfikatora elementu XML, analizator składni XML może przeprowadzić dodatkową weryfikację, gdy inne elementy odwołują się do identyfikatora; jako taki jest preferowanym sposobem określenia identyfikatora komponentu bean. Jednak specyfikacja XML ogranicza znaki dozwolone w identyfikatorach XML. Zwykle nie jest to ograniczenie, ale jeśli musisz użyć jednego z tych specjalnych znaków XML lub chcesz wprowadzić inne aliasy do komponentu bean, możesz również lub zamiast tego podać jeden lub więcej identyfikatorów bean, oddzielonych przecinkiem (, ), średnikiem (;) lub spacją w atrybucie „nazwa”.

Zasadniczo więc idatrybut jest zgodny ze standardami atrybutów XML id, ale namejest nieco bardziej elastyczny. Ogólnie rzecz biorąc, używam nameprawie wyłącznie. Po prostu wydaje się bardziej „wiosenny”.

Cletus
źródło
46
Wolisz używać atrybutu „nazwa”, mimo że cytowane przez Ciebie odniesienie do wiosny zaleca użycie atrybutu „id”? Nawet jeśli wolisz trzymać się „imienia”, nie możesz nazwać go bardziej „Spring-y”, jeśli odniesienie do wiosny sugeruje coś innego :) Wiem, że to kiepskie;)
theadam
77

Od wiosny 3.1 idatrybut ma wartość xsd:stringi pozwala na taki sam zakres znaków, jak nameatrybut.

Jedyna różnica między a idi a namepolega na tym, że a namemoże zawierać wiele aliasów oddzielonych przecinkiem, średnikiem lub białymi spacjami, podczas gdy a idmusi być pojedynczą wartością.

Z dokumentacji Spring 3.2:

W metadanych konfiguracyjnych opartych na języku XML atrybuty id i / lub name służą do określania identyfikatora (identyfikatorów) komponentu bean. Atrybut id pozwala określić dokładnie jeden identyfikator. Tradycyjnie te nazwy są alfanumeryczne („myBean”, „fooService” itp.), Ale mogą również zawierać znaki specjalne. Jeśli chcesz wprowadzić inne aliasy do komponentu bean, możesz również określić je w atrybucie name, oddzielając je przecinkiem (,), średnikiem (;) lub spacją. Historycznie rzecz biorąc, w wersjach wcześniejszych niż Spring 3.1 atrybut id został wpisany jako xsd: ID, co ograniczało możliwe znaki. Od wersji 3.1 jest to teraz xsd: string. Zauważ, że unikalność identyfikatora komponentu bean jest nadal wymuszana przez kontener, choć już nie przez parsery XML.

Duncan Jones
źródło
48

Każdy z nich działałby. Zależy to od twoich potrzeb:
jeśli identyfikator fasoli zawiera na przykład znaki specjalne ( /viewSummary.html), nie będzie dozwolony jako fasola id, ponieważ nie jest to prawidłowy identyfikator XML. W takich przypadkach można pominąć zdefiniowanie fasoli idi namezamiast tego podać fasolę . Atrybut pomaga w definiowaniu es do fasoli, ponieważ umożliwia określenie wielu identyfikatorów dla danego fasoli.
namealias

pugmarx
źródło
4
Plus jeden za wypowiedzenie go własnymi słowami i podanie przykładu, dlaczego potrzebne mogą być znaki specjalne.
Michael Piefel
Dziękuję Ci. Doceniam to.
pugmarx
3

Czy jest jakaś różnica między użyciem atrybutu id i atrybutu name w znaczniku <bean>

Istnieje kilka drobnych różnic, np. Użycie identyfikatora spowoduje zgłoszenie wyjątku, jeśli nie będzie obsługiwane poprawnie.
pozwól mi odpowiedzieć poniżej pytanie

Czy jest jakaś różnica między użyciem atrybutu id a użyciem atrybutu name w znaczniku <bean>,

Nie ma różnicy. ten sam efekt uzyskasz, gdy identyfikator lub nazwa zostaną użyte w znaczniku <bean>.

W jaki sposób?

Zarówno atrybuty id, jak i nazwa dają nam sposób na dostarczenie wartości identyfikatora do komponentu bean (w tej chwili myśl, że identyfikator oznacza identyfikator, ale nie identyfikator). W obu przypadkach zobaczysz ten sam wynik, jeśli zadzwonisz applicationContext.getBean("bean-identifier"); .

Weź @Bean, java równoważnik znacznika <bean>, nie znajdziesz atrybutu id. możesz podać wartość identyfikatora @Bean tylko poprzez atrybut name.

Pozwól, że wyjaśnię to na przykładzie:
weź ten plik konfiguracyjny, nazwijmy go jako 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>

Wiosna zwraca obiekt Foo Bo Foo f = (Foo) context.getBean("foo"); . Wymień id="foo"się name="foo"w powyższym spring1.xml, nadal pojawia się ten sam wynik.

Zdefiniuj konfigurację XML, np.

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

Otrzymasz BeanDefinitionParsingException. Powie, że nazwa fasoli „fooIdentifier” jest już używana w tym elemencie. Nawiasem mówiąc, jest to ten sam wyjątek, który zobaczysz, jeśli masz poniżej config
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </bean>
<bean name = "fooIdentifier" class = "com. intertech.Foo "> </bean>


Jeśli zachowasz zarówno identyfikator, jak i nazwę w znaczniku bean, mówi się, że bean ma 2 identyfikatory. możesz uzyskać tę samą fasolę z dowolnym identyfikatorem. weź config jako

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

następujący kod wypisuje wartość true

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
źródło
1

Czy istnieje różnica w definiowaniu identyfikatora i nazwy w pliku XML aplikacji ApplicationContext? Nie Od wersji 3.1 (wiosna) id jest również zdefiniowany jako ciąg typu xsd:. Oznacza to, że wszystkie znaki dozwolone w definicji nazwy są również dozwolone w Id. Nie było to możliwe przed wiosną 3.1.

Po co używać nazwy, gdy jest taka sama jak Id? Jest to przydatne w niektórych sytuacjach, na przykład pozwalając każdemu komponentowi w aplikacji odwoływać się do wspólnej zależności za pomocą nazwy komponentu bean, która jest specyficzna dla samego tego komponentu.

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" />
użytkownik3202413
źródło
0

Zarówno idi namesą identyfikatorami fasoli w Spring MKOl pojemnika / ApplicationContecxt. idAtrybut pozwala określić dokładnie jeden identyfikator, ale przy użyciu nameatrybutu można podać nazwę aliasu do tej fasoli.

Tutaj możesz sprawdzić dokument wiosenny .

Chirag Soni
źródło