La anotación @Autowired marca un método Constructor, Setter, Propiedades y Config() como autocableado que está ‘inyectando beans’ (Objetos) en tiempo de ejecución mediante el mecanismo Spring Dependency Injection que se muestra claramente en la imagen a continuación como se muestra:
Habilitación de la anotación @Autowired
Spring beans se pueden declarar mediante la configuración de Java o la configuración de XML. Al declarar beans, proporciona metadatos al Spring Container para devolver el objeto de dependencia requerido en tiempo de ejecución. Esto se llama Spring Bean Autowiring. En la configuración basada en Java, todos los métodos de bean se definen en la clase con la anotación @configuration . En tiempo de ejecución, Spring proporcionará definiciones de beans al leer esos métodos. Usando @Autowired , Spring Container asigna la dependencia correcta.
@Configuration public class AppConfig { // bean methods }
En la configuración basada en XML, si los beans se conectan mediante la anotación @Autowired, entonces se debe agregar <context:annotation-config/> al archivo XML. De lo contrario, puede incluir el bean AutowiredAnnotationBeanPostProcessor en el archivo de configuración XML.
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
@SpringBootApplication , que es una combinación de @Configuration, @EnableAutoConfiguration y @ComponentScan, analiza todos los componentes o servicios y otros archivos de configuración incluidos en los paquetes base y secundario. Esto los registrará en Spring Context e inyectará los beans en tiempo de ejecución usando @Autowired.
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
Usando @Autowired
Archivo de configuración XML
Si se usa la configuración XML para conectar los beans, entonces el archivo de configuración se ve así:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" xmlns:context="http://www.springframework.org/schema/context" > <context:annotation-config/> <bean id="customer" class="com.gfg.demo.domain.Customer"> <property name="type" value="1" /> </bean> <bean id="person" class="com.gfg.demo.domain.Person"> <property name="name" value="ganesh" /> <property name="age" value="21" /> </bean> </beans>
Clase de configuración de Java
Si se utiliza la configuración de Java para conectar los beans, entonces la clase de configuración se ve así:
package com.gfg.demo.config; import com.gfg.demo.domain.Customer; import com.gfg.demo.domain.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public Person person(){ Person person = new Person(); person.setName("ganesh"); person.setAge("21"); return person; } }
Después de habilitar la anotación @Autowired y decidir qué configuración usar. Los beans se pueden conectar a través del constructor o las propiedades o el método setter. Por ejemplo, hay dos clases POJO Cliente y Persona. La clase Cliente tiene una dependencia de la Persona.
Cliente.java
@Component public class Customer { private int type; private Person person; // Constructors // getters and setter }
Persona.java
public class Person { private String name; private String age; // Constructors // getters and setters }
Autowiring basado en constructor
La anotación @Autowired es opcional para la inyección basada en el constructor. Aquí, el objeto persona del contenedor se pasa al constructor al crear el objeto Cliente.
@Component public class Customer { private int type; private Person person; public Customer() { } @Autowired public Customer(Person person) { this.person = person; } }
Autowiring basado en propiedades
El objeto persona se inyectará en la propiedad persona en tiempo de ejecución mediante la anotación @Autowired
@Component public class Customer { private int type; @Autowired private Person person; }
Autowiring basado en Setter
El contenedor llamará al método setter con el objeto Person en tiempo de ejecución.
@Autowired public void setPerson(Person person) { this.person = person; }
Dependencias opcionales
Si el bean de tipo Person no está definido, Spring lanzará NoSuchBeanDefinitionException . Evita que Spring Container se inicie con éxito lanzando la siguiente excepción.
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.gfg.demo.Person' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Para arreglar esto, podemos establecer el atributo requerido de @Autowired como falso ,
@Autowired(required = false) private Person person;
Publicación traducida automáticamente
Artículo escrito por Ganeshchowdharysadanala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA