Dependencies And Configuration In Detail
Dependencies and Configuration in Detail
Como mencionamos en la sección anterior, puedes definir propiedades y argumentos del constructor en un bean como referencias a otro bean (colaboradores) o como un valor definido en linea. La configuración de metadata basada en XML de Spring soporta sub-elementos dentro de <property/> y <constructor-arg/> para este propósito.
Straight Values
El atributo value del elemento <property/> especifica una propiedad o argumento del constructor como una representación string. El servicio de conversión de Spring es usado para convertir estos valores de un String al tipo actual de la propiedad del argumento. El siguiente ejemplo muestran diferentes valores siendo establecidos:
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="misterkaoli"/>
</bean>
El siguiente ejemplo utiliza el espacio de nombres p para una configuración XML aún más concisa:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/mydb"
p:username="root"
p:password="misterkaoli"/>
</beans>
El anterior xml es mas preciso. Sin embargo, los tipos son descubiertos en tiempo de ejecución en vez de el tiempo de diseño, a no ser que uses un IDE que soporta el completado automático cuando creas definiciones de beans. Esta asistencia del IDE es recomendada.
También puede configurar una instancia java.util.Properties, de la siguiente manera:
<bean id="mappings"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<!-- typed as a java.util.Properties -->
<property name="properties">
<value>
jdbc.driver.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
</value>
</property>
</bean>
El contenedor de Spring convierte el texto dentro de la etiqueta java.util.Properties usando el mecanismo de JavaBeans PropertyEditor. Este es un gran atajo, y es uno de los pocos sitios donde el equipo de Spring recomienda el uso de la etiqueta anidada <value/> sobre el estilo del atributo value.
The idref element
La etiqueta idref es una forma a prueba de error de pasar el id (un valor string - no una referencia) de otro bean en el contenedor a una etiqueta <constructor-arg/> o <property/>
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
<property name="targetName">
<idref bean="theTargetBean"/>
</property>
</bean>
La anterior definición de bean es equivalente en tiempo de ejecución a este fragmento:
<bean id="theTargetBean" class="..." />
<bean id="theClientBean" class="...">
<property name="targetName" ref="theTargetBean"/>
</bean>
La primera forma es preferible que la segunda, dado que usando idref deja al contenedor validar en tiempo de deploy que el bean referenciado existe. En la segunda variante, no se realiza validación en el valor que es pasado a la propiedad targetName del bean client . Los tipos son solamente descubiertos cuando el bean client es instanciado. Si el bean client es un bean con un scope prototype, este tipo y la excepción resultante solamente será descubierta tiempo después de que el contenedor haya sido desplegado.
El atributo
localen la etiquetaidrefya no es soportada en la version 4.0 XSD de los beans, dado que no provee un valor sobre un referencia en un bean regular. Cambia tus referenciasidref localaidref beancuando actualices el schema a la 4.0
Un lugar común donde la etiqueta <idref/> devuelve un valor es en la configuración de AOP interceptors en un definición de bean ProxyFactoryBean. Usando <idref/> cuando especificas el nombre del interceptor previene de escribir mal un interceptor ID.
-
idref
El elemento
<idref>en Spring se utiliza para evitar errores al pasar el ID de otro bean dentro del contenedor de Spring a las propiedades de otro bean. Esto permite que Spring valide que el bean referenciado realmente exista en el momento de la configuración, evitando errores que solo se descubrirían cuando se inicie la aplicación.Por ejemplo, en lugar de usar un
refdirectamente, como en:<bean id="cliente" class="..."> <property name="targetName" ref="beanObjetivo"/> </bean>Se puede usar
<idref>para que Spring valide si el bean existe al momento de la carga de configuración:<bean id="cliente" class="..."> <property name="targetName"> <idref bean="beanObjetivo"/> </property> </bean>Esto es útil porque si hay un error tipográfico en el ID, Spring lo detectará al cargar la configuración, en lugar de cuando el bean se instancia, lo que podría ser más difícil de detectar y solucionar.
Además, el atributo
localdentro de<idref>ya no se usa en las versiones más recientes de Spring, por lo que se recomienda usar solo el atributobean.
References to Other Beans (Collaborators)
La etiqueta ref es el elemento final dentro de las etiquetas<constructor-arg/> o <property/>. Aquí estableces
Aquí, se establece el valor de la propiedad especificada de un bean para que sea una referencia a otro bean (un colaborador) gestionado por el contenedor.
El bean referenciado es una dependencia del bean cuya propiedad se va a establecer, y se inicializa bajo demanda según sea necesario antes de que se establezca la propiedad. (Si el colaborador es un bean singleton, puede que ya esté inicializado por el contenedor). Todas las referencias son, en última instancia, una referencia a otro objeto. El ámbito y la validación dependen de si se especifica el ID o el nombre del otro objeto a través del atributo bean o parent.
Especificar el bean de destino a través del atributo bean de la etiqueta es la forma más general y permite crear una referencia a cualquier bean del mismo contenedor o contenedor padre, independientemente de que se encuentre en el mismo archivo XML. El valor del atributo bean puede ser el mismo que el atributo id del bean de destino o ser el mismo que uno de los valores del atributo name del bean de destino. El siguiente ejemplo muestra cómo utilizar un elemento ref:
<ref bean="someBean"/>
Al especificar el bean de destino a través del atributo parent se crea una referencia a un bean que se encuentra en un contenedor padre del contenedor actual. El valor del atributo parent puede ser el mismo que el atributo id del bean destino o uno de los valores del atributo name del bean destino. El bean destino debe estar en un contenedor padre del actual. Deberías utilizar esta variante de referencia de bean principalmente cuando tengas una jerarquía de contenedores y quieras envolver un bean existente en un contenedor padre con un proxy que tenga el mismo nombre que el bean padre. El siguiente par de listados muestra cómo utilizar el atributo padre:
<!-- in the parent context -->
<bean id="accountService" class="com.something.SimpleAccountService">
<!-- insert dependencies as required here -->
</bean>
<!-- in the child (descendant) context, bean name is the same as the parent bean -->
<bean id="accountService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref parent="accountService"/> <!-- notice how we refer to the parent bean -->
</property>
<!-- insert other configuration and dependencies as required here -->
</bean>
El atributo
localdel elementorefya no está soportado en el XSD de beans 4.0, puesto que ya no proporciona valor sobre una referenciabeannormal. Cambie sus referenciasref localexistentes aref beancuando actualice al esquema 4.0.
Inner Beans
Un elemento
<bean id="outer" class="...">
<!-- instead of using a reference to a target bean, simply define the target bean inline -->
<property name="target">
<bean class="com.example.Person"> <!-- this is the inner bean -->
<property name="name" value="Fiona Apple"/>
<property name="age" value="25"/>
</bean>
</property>
</bean>
La definición de un bean interno no requiere un identificador o nombre definido. Si se especifica, el contenedor no utiliza dicho valor como identificador. El contenedor también ignora el indicador de ámbito en la creación, porque los beans internos son siempre anónimos y se crean siempre con el bean externo. No es posible acceder a los beans internos de forma independiente ni inyectarlos en beans colaboradores que no sean el bean adjunto.
Como caso excepcional, es posible recibir devoluciones de llamada de destrucción desde un ámbito personalizado, por ejemplo, para un bean interno con ámbito de solicitud contenido dentro de un bean singleton. La creación de la instancia del bean interno está ligada al bean que lo contiene, pero las devoluciones de llamada de destrucción le permiten participar en el ciclo de vida del ámbito de solicitud. Este no es un escenario común. Los beans internos suelen compartir el ámbito del bean que los contiene.
Collections
Los elementos ,
<bean id="moreComplexObject" class="example.ComplexObject">
<!-- results in a setAdminEmails(java.util.Properties) call -->
<property name="adminEmails">
<props>
<prop key="administrator">administrator@example.org</prop>
<prop key="support">support@example.org</prop>
<prop key="development">development@example.org</prop>
</props>
</property>
<!-- results in a setSomeList(java.util.List) call -->
<property name="someList">
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource" />
</list>
</property>
<!-- results in a setSomeMap(java.util.Map) call -->
<property name="someMap">
<map>
<entry key="an entry" value="just some string"/>
<entry key="a ref" value-ref="myDataSource"/>
</map>
</property>
<!-- results in a setSomeSet(java.util.Set) call -->
<property name="someSet">
<set>
<value>just some string</value>
<ref bean="myDataSource" />
</set>
</property>
</bean>
El valor de una clave o valor de mapa, o un valor de conjunto, también puede ser cualquiera de los siguientes elementos:
bean | ref | idref | list | set | map | props | value | null