Conexión automática de beans

Se pueden conectar automáticamente los beans (autowired) de 4 modos:

  • byName → Busca los beans con un id igual al nombre de la propiedad.
  • byType →Busca los del mismo tipo que la propiedad.
  • constructor →Busca beans asignables a los argumentos del constructor.
  • autodetect →Lo intenta por constructor y si falla, busca por tipo.

Configuración:

Por ejemplo, por nombre:

Significa que si la clase “Piso”, tiene una propiedad “ventana”, intentará buscar un bean con ese id, para enchufárselo. Para que un bean, no sea el principal candidato para ser enchufado, hay que seleccionar su propiedad primary=”false”, si lo que queremos es que no se  tenga en cuenta lo definiremos como autowire-candidate=”false” Para definir la autoconexión en todos los beans de un archivo xml por defecto, se añade en la definición de la etiqueta “beans” la propiedad default-autowire=”byType”. Que se defina el autowire, no quiere decir que no se puedan inyectar de la manera habitual. Autoconexión con anotaciones Para usar autoconexión con anotaciones, hay que activar esta funcionalidad:

Spring soporta tres tipos de anotaciones para esto:

  • @Autowired → El propio de Spring
  • @Inject → de JSR-330
  • @Resource → de JSR-250

@Autowired

Por ejemplo:

Al hacer esto Spring intenta conectarlo por tipo, además, no hace falta que método sea un “setter”, se podría haber puesto @Autowired en un método “elEdificio(Edificio e)”, en un constructor, o incluso directamente en una propiedad de la clase:

Si no se encuentran beans o se encuentra más de uno se produce un error.

  • Si queremos que no falle cuando no encuentra ninguno y que se quede a nulo habra que definirlo como → @Autowired(required=false)
  • Si queremos evitar ambigüedades con @Qualifier + el id, por Ej.:

En realidad qualifier no es estrictamente el id del bean, se pueden marcar beans con calificadores, de modo que entre el tipo y el calificador saque el bean, por ejemplo “transporte” con el calificador “aereo”.

@Inject

Por ejemplo:

Funciona igual que @Autowired, pero sin la propiedad required. En lugar de Qualifier, utiliza Name, que esta vez sí, hace referencia únicamente al id.

@Value

Por ejemplo:

Asigna valor a la propiedad, lo bueno que tiene es que puedes usar SpEL

Descubriendo beans

Antes hemos evitado el mapeo de propiedades y constructores, pero seguía siendo necesario definir los beans en los xml.

Se le puede indicar a Spring que mapee las clases de un paquete como beans de spring. ¿Qué clases se mapean y que clases no? Ok, se mapean las que se anoten con:

  • @Component → Indica que es un componente de Spring
  • @Controller → Un controlador del MVC de Spring
  • @Repository → Las clases que definen un repositorio de datos
  • @Service → Servicios
  • @Configuration → Configuración basada en Java. Esta anotación la usan las clases java que definen en su interior varios beans de spring.
  • Cualquiera hecha a medida y que extienda de @Component

Para indicar el paquete a escanear:

Como se puede ver se incluyen filtros para indicar las clases a incluir y a excluir (mirar documentación de Spring para más detalles).

Por ejemplo:

El id de los campos se genera con el nombre de la clase al estilo “kamel”, en este caso sería “casaUsuario”, porque lo hemos especificado en la anotación

2 comentarios:

  1. Diego Manuel Benitez Enciso

    Muy bueno

  2. Daniel Villalobos

    Buena explicacion me sirvio de mucho, sin embargo por mi trabajo prefiero usar archivos XML que es mas facil al hacer modificaciones rapidos en ambientes de produccion.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *