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:

Tabla 2. Modos de vinculación y detección automática
Modo Explanation

no

(Predeterminado) Sin detección ni vinculación automática. Las referencias de beans deben estar definidas por elementos ref. No se recomienda cambiar la configuración predeterminada para implementaciones grandes porque especificar explícitamente objetos que interactúan proporciona mayor control y claridad. Hasta cierto punto, documenta la estructura del sistema.

byName

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 master (es decir, tiene un método setMaster(..)), Spring busca una definición de bean con el nombre master y la usa para establecer la propiedad.

por tipo

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 byType no se puede utilizar para ese bean. Si no hay beans coincidentes, no sucederá nada (la propiedad no se establecerá).

constructor

Similar a byType, pero se aplica a los argumentos del constructor. Si el contenedor no tiene exactamente un bean con el tipo de argumento del constructor, entonces se produce un error crítico.

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 y constructor-arg siempre anulan el descubrimiento y el enlace automáticos. Las propiedades simples como primitivas, Strings y Classes (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 en false

  • Designe una definición de bean como bean primario candidato estableciendo el atributo primary del elemento <bean/> en true.

  • 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).

El atributo 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.