El contenedor Spring puede establecer automáticamente relaciones entre beans comunicantes. Puede permitir que Spring
resuelva automáticamente los objetos colaboradores (otros beans) para su bean mirando el contenido de ApplicationContext
.
La detección y vinculación automática tiene las siguientes ventajas:
-
La detección y el enlace automáticos pueden reducir significativamente el número de instrucciones para especificar propiedades o argumentos del constructor (otros mecanismos, como la plantilla de bean, que se analiza en otras secciones de este capítulo, también son útiles a este respecto).
-
El descubrimiento y la vinculación automáticos le permiten actualizar su configuración a medida que sus objetos evolucionan. Por ejemplo, si necesita agregar una dependencia a una clase, esa dependencia se puede satisfacer automáticamente sin tener que cambiar la configuración. Por lo tanto, el descubrimiento y la vinculación automáticos pueden ser especialmente útiles durante el desarrollo, pero no excluyen la posibilidad de pasar a la vinculación explícita una vez que el código base sea estable.
Cuando utilice metadatos de configuración basados en XML, puede establecer el modo de conexión automática en la
definición del bean utilizando el atributo autowire
del elemento <bean/>
. La
funcionalidad de descubrimiento y vinculación automática tiene cuatro modos. Usted configura el descubrimiento y la
vinculación automáticos para cada bean y, por lo tanto, puede elegir cuáles vincular automáticamente. La siguiente
tabla describe los cuatro modos de enlace y descubrimiento automático:
Modo | Explanation |
---|---|
|
(Predeterminado) Sin detección ni vinculación automática. Las referencias de beans deben
estar definidas por elementos |
|
Descubrimiento automático y vinculación por nombre de propiedad. Spring busca un bean con el
mismo nombre que la propiedad que debería descubrirse y vincularse automáticamente. Por
ejemplo, si una definición de bean contiene una instrucción para detectar y vincular
automáticamente por nombre y una propiedad |
|
Permite descubrir y asociar automáticamente una propiedad si existe exactamente un bean con
ese tipo de propiedad en el contenedor. Si existe más de uno, se genera una excepción
crítica que indica que el modo de detección automática y enlace |
|
Similar a |
Usando el modo de detección y enlace automático byType
o constructor
puedes
vincular matrices y colecciones escritas. En tales casos, todos los componentes candidatos para el
descubrimiento y enlace automáticos que están en el contenedor y que coinciden con el tipo esperado
se proporcionan para satisfacer la dependencia. Puede buscar y asociar automáticamente instancias
Map
fuertemente tipadas si el tipo de clave esperado es String
. Los
valores de una instancia Map
enlazada automáticamente constan de todas las instancias
de bean que coinciden con el tipo esperado, y las claves de la instancia Map
contienen
los nombres de bean correspondientes.
Limitaciones y desventajas de la detección y vinculación automática
El descubrimiento y la vinculación automáticos funcionan mejor cuando se usan de manera consistente durante todo el proyecto. Si no se utiliza el descubrimiento y la vinculación automáticos, puede resultar difícil para los desarrolladores usarlos para vincular solo una o dos definiciones de beans.
Veamos las limitaciones y desventajas de la detección y vinculación automáticas:
-
Las dependencias explícitas en
property
yconstructor-arg
siempre anulan el descubrimiento y el enlace automáticos. Las propiedades simples como primitivas,Strings
yClasses
(y matrices de propiedades tan simples) no se pueden vincular automáticamente. Esta limitación es intencionada. -
La detección y vinculación automáticas son menos precisas que las vinculaciones explícitas. Aunque, como se señala en la tabla anterior, Spring intenta no recurrir a conjeturas en caso de ambigüedad, lo que puede llevar a resultados inesperados. Las relaciones entre sus objetos administrados por Spring ya no están documentadas explícitamente.
-
Es posible que la información vinculante no esté disponible para las herramientas que pueden generar documentación desde un contenedor Spring.
-
Varias definiciones de beans en un contenedor pueden coincidir con el tipo especificado por un método de establecimiento o un argumento de constructor para el descubrimiento y vinculación automáticos. Para matrices, colecciones o instancias de
Map
esto no es necesariamente un problema. Sin embargo, para las dependencias en las que se espera un valor único, esta ambigüedad no se resuelve arbitrariamente. Si no hay disponible una definición de bean única, se lanza una excepción.
En este último caso, tienes varias opciones:
-
Evite el descubrimiento automático y los enlaces en favor de enlaces explícitos.
-
Evite el descubrimiento automático y el enlace de una definición de bean configurando sus atributos
autowire-candidate
enfalse
-
Designe una definición de bean como bean primario candidato estableciendo el atributo
primary
del elemento<bean/>
entrue
. -
Implemente el control más preciso disponible con la configuración basada en anotaciones.
Excluir un bean del método de descubrimiento y vinculación automático
Para cada contenedor, puede excluirlo del método de vinculación y descubrimiento automático. En
formato Spring XML, establezca el atributo autowire-candidate
del elemento <bean/>
en false
. El contenedor hará que esa definición de bean en particular no esté
disponible para el marco de enlace y descubrimiento automático (incluidas las configuraciones de
estilo de anotación como @Autowired
).
autowire-candidate
está destinado
únicamente a afectar el método de vinculación y detección de autowire basado en tipos. No afecta las
referencias explícitas por nombre, que se resuelven incluso si el bean especificado no está marcado
como componente candidato para el descubrimiento y vinculación automáticos. Como consecuencia, la
detección automática y la vinculación por nombre inyectarán el bean si el nombre coincide.
También puede limitar los componentes candidatos para el descubrimiento automático y el enlace en
función de la coincidencia de patrones con los nombres de los beans. El elemento
<bean/>
de nivel superior acepta uno o más patrones en su atributo default-autowire-candidates
.
Por ejemplo, para restringir el descubrimiento automático y el estado del candidato vinculante de un
bean a cualquier bean cuyo nombre termine en Repository
, sustituya el valor *Repository
.
Para pasar varios patrones, especifíquelos en una lista separada por comas. Un valor explícito
true
o false
para el atributo autowire-candidate
en una
definición de bean siempre tiene prioridad. Para este tipo de beans, no se aplican reglas de
coincidencia de patrones.
Estos métodos son útiles si tiene beans que nunca necesitará inyectar en otros beans mediante el descubrimiento y la vinculación automáticos. Esto no significa que un bean excluido no pueda configurarse mediante descubrimiento y vinculación automáticos. Más bien, el bean en sí no es un componente candidato para descubrir y vincular automáticamente otros beans.