Saltar al contenido

Comprender el uso de Spring @Autowired

Basta ya de buscar en otros sitios ya que has llegado al espacio justo, contamos con la solución que buscas y sin liarte.

Solución:

TL; DR

El @Autowired annotation le ahorra la necesidad de hacer el cableado usted mismo en el archivo XML (o de cualquier otra manera) y solo encuentra por usted lo que necesita inyectarse donde y lo hace por usted.

Explicación completa

El @Autowired La anotación le permite omitir configuraciones en otros lugares de qué inyectar y simplemente lo hace por usted. Asumiendo que su paquete es com.mycompany.movies tienes que poner esta etiqueta en tu XML (archivo de contexto de la aplicación):


Esta etiqueta hará un escaneo automático. Suponiendo que cada clase que tiene que convertirse en un bean está anotada con una anotación correcta como @Component (para frijol simple) o @Controller (para un control de servlet) o @Repository (por DAO clases) y estas clases están en algún lugar debajo del paquete com.mycompany.movies, Spring encontrará todos estos y creará un bean para cada uno. Esto se hace en 2 escaneos de las clases: la primera vez solo busca las clases que necesitan convertirse en un bean y mapea las inyecciones que necesita hacer, y en el segundo escaneo inyecta los beans. Por supuesto, puede definir sus beans en el archivo XML más tradicional o con un @Configuration clase (o cualquier combinación de las tres).

El @Autowired La anotación le dice a Spring dónde debe ocurrir una inyección. Si lo pones en un método setMovieFinder entiende (por el prefix set + el @Autowired anotación) que es necesario inyectar un bean. En el segundo escaneo, Spring busca un bean de tipo MovieFinder, y si encuentra dicho bean, lo inyecta en este método. Si encuentra dos de esos frijoles, obtendrá un Exception. Para evitar el Exception, puedes usar el @Qualifier anotación y dígale cuál de los dos frijoles inyectar de la siguiente manera:

@Qualifier("redBean")
class Red implements Color 
   // Class code here


@Qualifier("blueBean")
class Blue implements Color 
   // Class code here

O si prefiere declarar los beans en su XML, se vería así:




En el @Autowired declaración, también debe agregar la @Qualifier para saber cuál de los dos colores de frijoles inyectar:

@Autowired
@Qualifier("redBean")
public void setColor(Color color) 
  this.color = color;

Si no desea utilizar dos anotaciones (el @Autowired y @Qualifier) puedes usar @Resource para combinar estos dos:

@Resource(name="redBean")
public void setColor(Color color) 
  this.color = color;

El @Resource (puede leer algunos datos adicionales al respecto en el primer comentario de esta respuesta) le ahorra el uso de dos anotaciones y, en cambio, solo usa una.

Solo agregaré dos comentarios más:

  1. Una buena práctica sería utilizar @Inject en vez de @Autowired porque no es específico de Spring y es parte del JSR-330 estándar.
  2. Otra buena práctica sería poner el @Inject / @Autowired en un constructor en lugar de un método. Si lo pones en un constructor, puedes validar que los beans inyectados no son null y fallar rápidamente cuando intenta iniciar la aplicación y evitar un NullPointerException cuando realmente necesita usar el bean.

Actualizar: Para completar la imagen, creé una nueva pregunta sobre el @Configuration clase.

Nada en el ejemplo dice que las “clases implementan la misma interfaz”. MovieCatalog es un tipo y CustomerPreferenceDao es otro tipo. La primavera puede distinguirlos fácilmente.

En Spring 2.x, el cableado de los beans se realizaba principalmente a través de ID o nombres de beans. Esto todavía es compatible con Spring 3.x, pero a menudo, tendrá una instancia de un bean con un cierto tipo; la mayoría de los servicios son singleton. Crear nombres para esos es tedioso. Así que Spring comenzó a admitir “autowire por tipo”.

Lo que muestran los ejemplos son varias formas que puede utilizar para inyectar beans en campos, métodos y constructores.

El XML ya contiene toda la información que Spring necesita, ya que debe especificar el nombre de clase completo en cada bean. Sin embargo, debe tener un poco de cuidado con las interfaces:

Este cableado automático fallará:

 @Autowired
 public void prepare( Interface1 bean1, Interface1 bean2 )  ... 

Dado que Java no mantiene los nombres de los parámetros en el código de bytes, Spring ya no puede distinguir entre los dos beans. La solución es usar @Qualifier:

 @Autowired
 public void prepare( @Qualifier("bean1") Interface1 bean1,
     @Qualifier("bean2")  Interface1 bean2 )  ... 

Sí, puede configurar el archivo xml de contexto de servlet de Spring para definir sus beans (es decir, clases), de modo que pueda realizar la inyección automática por usted. Sin embargo, tenga en cuenta que debe realizar otras configuraciones para que Spring esté en funcionamiento y la mejor manera de hacerlo es seguir un tutorial desde cero.

Una vez que haya configurado su Spring probablemente, puede hacer lo siguiente en su archivo xml de contexto de servlet de Spring para que funcione el Ejemplo 1 anterior (por favor reemplazar el nombre del paquete de com.movies a lo que el true el nombre del paquete es y si se trata de una clase de terceros, asegúrese de que el archivo jar apropiado esté en la ruta de clase):


o si la clase MovieFinder tiene un constructor con un valor primitivo, entonces podría algo como esto,


    

o si la clase MovieFinder tiene un constructor esperando otra clase, entonces podría hacer algo como esto,


    

…donde ‘otherBeanRef‘es otro bean que tiene una referencia a la clase esperada.

Sección de Reseñas y Valoraciones

Al final de todo puedes encontrar las interpretaciones de otros administradores, tú incluso eres capaz dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4.5)



Utiliza Nuestro Buscador

Deja una respuesta

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