Diferencia entre usar el ID y el nombre del bean en el archivo de configuración de Spring

205

¿Hay alguna diferencia entre usar un idatributo y un nameatributo en un <bean>elemento en un archivo de configuración de Spring?

Duncan Jones
fuente
8
Es difícil llegar a preguntas tan sencillas y respuestas tan sencillas y completas. Excelente. ¡Gracias!
Peter Perháč

Respuestas:

129

De la referencia de Spring , 3.2.3.1 Naming Beans :

Cada bean tiene uno o más identificadores (también llamados identificadores o nombres; estos términos se refieren a lo mismo). Estos identificadores deben ser únicos dentro del contenedor en el que está alojado el bean. Un bean casi siempre tendrá una sola identificación, pero si un bean tiene más de una identificación, las adicionales pueden considerarse esencialmente alias.

Cuando utiliza metadatos de configuración basados ​​en XML, utiliza los atributos 'id' o 'nombre' para especificar los identificadores de bean. El atributo 'id' le permite especificar exactamente una identificación, y como es un atributo de ID de elemento XML real, el analizador XML puede hacer una validación adicional cuando otros elementos hacen referencia a la identificación; como tal, es la forma preferida de especificar un ID de bean. Sin embargo, la especificación XML limita los caracteres que son legales en las ID de XML. Por lo general, esto no es una restricción, pero si necesita usar uno de estos caracteres XML especiales, o si desea introducir otros alias en el bean, también puede o en su lugar especificar uno o más identificadores de bean, separados por una coma (, ), punto y coma (;) o espacio en blanco en el atributo 'nombre'.

Entonces, básicamente, el idatributo se ajusta a los estándares de atributos de id XML, mientras que namees un poco más flexible. En general, uso namecasi exclusivamente. Simplemente parece más "Spring-y".

cletus
fuente
46
¿Prefieres usar el atributo "nombre" aunque la referencia de Spring que has citado recomienda usar el atributo "id"? Incluso si prefieres seguir con "nombre", no puedes llamarlo más "Spring-y" si la referencia de Spring sugiere lo contrario :) Esto es un poco complicado, lo sé;)
theadam
77

Desde Spring 3.1, el idatributo es an xsd:stringy permite el mismo rango de caracteres que elname atributo.

La única diferencia entre an idy a namees que a namepuede contener múltiples alias separados por una coma, punto y coma o espacios en blanco, mientras que unid debe ser un valor único.

De la documentación de Spring 3.2:

En los metadatos de configuración basados ​​en XML, utiliza los atributos de identificación y / o nombre para especificar los identificadores del bean. El atributo id le permite especificar exactamente un id. Convencionalmente, estos nombres son alfanuméricos ('myBean', 'fooService', etc.), pero también pueden tener caracteres especiales. Si desea introducir otros alias en el bean, también puede especificarlos en el atributo de nombre, separados por una coma (,), punto y coma (;) o espacio en blanco. Como nota histórica, en versiones anteriores a Spring 3.1, el atributo id se escribía como xsd: ID, lo que limitaba los posibles caracteres. A partir de 3.1, ahora es xsd: string. Tenga en cuenta que el contenedor todavía aplica la unicidad de ID de bean, aunque ya no lo hacen los analizadores XML.

Duncan Jones
fuente
48

Cualquiera de los dos funcionaría. Depende de sus necesidades:
si su identificador de bean contiene caracteres especiales, por ejemplo ( /viewSummary.html), no se permitirá como bean id, porque no es un ID XML válido. En tales casos, puede omitir la definición del bean idy suministrar el bean en su namelugar.
El nameatributo también ayuda a definir aliases para su bean, ya que permite especificar múltiples identificadores para un bean dado.

pugmarx
fuente
44
Más uno para decirlo en sus propias palabras y dar un ejemplo de por qué se pueden necesitar caracteres especiales.
Michael Piefel
Gracias. Lo aprecio.
pugmarx
3

¿Hay alguna diferencia entre usar un atributo id y un atributo de nombre en una etiqueta <bean>

Existen pocas diferencias menores como, el uso de id arrojará una excepción si no se maneja correctamente.
déjame responder la siguiente pregunta

¿Hay alguna diferencia entre usar un atributo id y usar un atributo de nombre en una etiqueta <bean>,

No hay diferencia. experimentará el mismo efecto cuando se use id o nombre en una etiqueta <bean>.

¿Cómo?

Tanto los atributos de identificación como los de nombre nos brindan un medio para proporcionar un valor de identificador a un bean (por el momento, piense que id significa id pero no identificador). En ambos casos, verá el mismo resultado si llamaapplicationContext.getBean("bean-identifier"); .

Tome @Bean, el equivalente java de la etiqueta <bean>, no encontrará un atributo de identificación. puede dar su valor de identificador a @Bean solo a través del atributo de nombre.

Permítanme explicarlo a través de un ejemplo:
tome este archivo de configuración, llamémoslo como 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>

Primavera vuelve objeto Foo para, Foo f = (Foo) context.getBean("foo"); . Reemplace id="foo"con name="foo"en el spring1.xml anterior, aún verá el mismo resultado.

Defina su configuración xml como,

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

Obtendrá BeanDefinitionParsingException. Dirá, el nombre de Bean 'fooIdentifier' ya se usa en este elemento. Por cierto, esta es la misma excepción que verás si tienes debajo config
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </bean>
<bean name = "fooIdentifier" class = "com. intertech.Foo "> </bean>


Si mantiene tanto la identificación como el nombre en la etiqueta del bean, se dice que el bean tiene 2 identificadores. puedes obtener el mismo bean con cualquier identificador. tomar config como

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

el siguiente código imprime verdadero

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

¿Hay alguna diferencia al definir Id & name en ApplicationContext xml? No A partir de 3.1 (spring), id también se define como un xsd: tipo de cadena. Significa que los caracteres permitidos en la definición del nombre también se permiten en Id. Esto no fue posible antes de Spring 3.1.

¿Por qué usar name cuando es lo mismo que Id? Es útil para algunas situaciones, como permitir que cada componente de una aplicación haga referencia a una dependencia común mediante el uso de un nombre de bean que sea específico para ese componente en sí.

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" />
usuario3202413
fuente
0

Ambos idy nameson identificadores de beans en el contenedor Spring IOC / ApplicationContecxt. El idatributo le permite especificar exactamente una identificación, pero al usar el nameatributo puede darle un nombre de alias a ese bean.

Puedes consultar el documento de primavera aquí.

chirag soni
fuente