¿Hay alguna diferencia entre usar un id
atributo y un name
atributo en un <bean>
elemento en un archivo de configuración de Spring?
¿Hay alguna diferencia entre usar un id
atributo y un name
atributo en un <bean>
elemento en un archivo de configuración de Spring?
Respuestas:
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 id
atributo se ajusta a los estándares de atributos de id XML, mientras que name
es un poco más flexible. En general, uso name
casi exclusivamente. Simplemente parece más "Spring-y".
Desde Spring 3.1, el id
atributo es an xsd:string
y permite el mismo rango de caracteres que elname
atributo.
La única diferencia entre an id
y a name
es que a name
puede 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.
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 id
y suministrar el bean en su name
lugar.
El name
atributo también ayuda a definir alias
es para su bean, ya que permite especificar múltiples identificadores para un bean dado.
¿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
¿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" />
Ambos id
y name
son identificadores de beans en el contenedor Spring IOC / ApplicationContecxt. El id
atributo le permite especificar exactamente una identificación, pero al usar el name
atributo puede darle un nombre de alias a ese bean.
Puedes consultar el documento de primavera aquí.