Spring @Autowired Anotación

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

Deja una respuesta

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