Spring @Required Anotación con ejemplo

Spring Annotations nos permite configurar dependencias e implementar la inyección de dependencias a través de programas Java. Esas son una forma de metadatos que proporciona datos sobre un programa. La anotación @Required en primavera es una anotación a nivel de método utilizada en el método setter de una propiedad de bean y, por lo tanto, hace que la inyección setter sea obligatoria. Esta anotación sugiere que la propiedad requerida del bean debe inyectarse con un valor en el momento de la configuración que mostraremos y explicaremos en el siguiente ejemplo.  

requisitos previos

Implementación:

Paso 1: Primero, creemos una aplicación Spring simple e inyectemos los valores literales mediante inyección de setter. Por lo tanto, cree una clase simple Student que tenga tres atributos rollNo, name y age. Cree métodos setter para estos dos atributos y un método simple para imprimir los detalles del estudiante.

Archivo: Student.java

Java

// Java Program to Illustrate Student Class
 
// Class
public class Student {
 
    // Class data members
    private int rollNo;
    private String name;
    private int age;
 
    // Setter
    public void setRollNo(int rollNo)
    {
        this.rollNo = rollNo;
    }
 
    // Setter
    public void setName(String name) { this.name = name; }
 
    // Setter
    public void setAge(int age) { this.age = age; }
 
    // Method
    public void display()
    {
 
        // Printing attributes of student
        System.out.println("Roll No: " + rollNo);
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

Paso 2:  Vamos a crear un archivo de propiedades en su classpath y nombrarlo como student-info.properties (para este ejemplo lo llamamos así, puede nombrarlo según sus necesidades). Y en este archivo, vamos a escribir algo como esto

student.rollNo = 201
student.name = Asish
student.age = 30

Paso 3: establezcamos los valores del archivo de propiedades utilizando la anotación @Value. Entonces, podemos modificar nuestro archivo Student.java algo como esto

Java

import org.springframework.beans.factory.annotation.Value;
 
public class Student {
    private int rollNo;
    private String name;
    private int age;
 
    @Value("${student.rollNo}")
    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }
 
    @Value("${student.name}")
    public void setName(String name) {
        this.name = name;
    }
 
    @Value("${student.age}")
    public void setAge(int age) {
        this.age = age;
    }
 
    public void display(){
        System.out.println("Roll No: " + rollNo);
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

Paso 4: Ahora vamos a crear un Student Bean en el archivo beans.xml. A continuación se muestra el código completo para el archivo beans.xml

XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
 
    <context:annotation-config/>
      <context:property-placeholder location="classpath:student-info.properties"/>
 
    <bean id="student" class="Student">
 
    </bean>
   
</beans>

Paso 5: Ahora nuestro frijol está listo. Ahora vamos a crear una clase y definir el método main() dentro de esa clase. Supongamos que hemos creado una clase llamada Main y hemos definido el método main() dentro de esta clase. A continuación se muestra el código de la clase Main.java . Los comentarios se agregan dentro del código para una mejor comprensión.

A. Archivo: Main.java

Java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Main {
    public static void main(String[] args) {
        // Using ApplicationContext tom implement Spring IoC
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
 
        // Get the bean student
        Student student = context.getBean("student", Student.class);
 
        // Calling the methods
        student.display();
    }
}

Ahora ejecuta tu método main() y el resultado será así.

Producción:

Roll No: 201
Name: Asish
Age: 30

Así que nuestra aplicación está funcionando bien. Ahora volvamos al archivo Student.java y eliminemos @Value(“${student.rollNo}”) antes del método setRollNo(). Así que ahora nuestro archivo Student.java modificado es algo así como lo siguiente:

B. Archivo: Student.java

Java

import org.springframework.beans.factory.annotation.Value;
 
public class Student {
 
    private int rollNo;
    private String name;
    private int age;
     
    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }
 
    @Value("${student.name}")
    public void setName(String name) {
        this.name = name;
    }
 
    @Value("${student.age}")
    public void setAge(int age) {
        this.age = age;
    }
 
    public void display(){
        System.out.println("Roll No: " + rollNo);
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

Ahora vuelva a ejecutar su método main() y el resultado será así.

Producción:

Roll No: 0
Name: Asish
Age: 30

Por lo tanto, se crea el objeto de la clase Student pero no se ha asignado el valor Roll no. Pero queremos que el valor Roll No se complete antes de crear el objeto de clase Student. Puede considerar que Roll no es una clave principal y no queremos que este valor sea nulo. Así que aquí entra en escena la anotación @Required . Entonces, si modificamos nuestro archivo Student.java como los siguientes, obtendremos excepciones en nuestro programa. 

C. Archivo: Student.java 

Java

import org.springframework.beans.factory.annotation.Required;
import org.springframework.beans.factory.annotation.Value;
 
public class Student {
 
    private int rollNo;
    private String name;
    private int age;
 
    @Required
    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }
 
    @Value("${student.name}")
    public void setName(String name) {
        this.name = name;
    }
 
    @Value("${student.age}")
    public void setAge(int age) {
        this.age = age;
    }
 
    public void display(){
        System.out.println("Roll No: " + rollNo);
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

Excepción:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'student' defined in class path resource [beans.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Property 'rollNo' is required for bean 'student'
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:610)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85)
    at Main.main(Main.java:7)
Caused by: org.springframework.beans.factory.BeanInitializationException: Property 'rollNo' is required for bean 'student'
    at org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.postProcessPropertyValues(RequiredAnnotationBeanPostProcessor.java:158)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1418)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
    ... 11 more

Entonces, en este escenario, la consola de excepción intenta decirnos que es obligatorio proporcionar el valor a Roll no para crear el objeto de clase Student. Entonces, si desea que algún valor de campo se complete con algún valor, entonces debe usar la anotación @Required. Entonces podemos modificar nuestro archivo Student.java algo como esto de la siguiente manera:

D. Archivo: Student.java

Java

// Java Program to Illustrate Modified Student Class
 
// Importing required classes
import org.springframework.beans.factory.annotation.Required;
import org.springframework.beans.factory.annotation.Value;
 
// Class
public class Student {
 
    // Class data members
    private int rollNo;
    private String name;
    private int age;
 
    // Annotation
    @Required
    @Value("${student.rollNo}")
    // Setter
    public void setRollNo(int rollNo)
    {
        this.rollNo = rollNo;
    }
 
    // Setter
    @Value("${student.name}")
    public void setName(String name)
    {
 
        // this keyword refers to current instance itself
        this.name = name;
    }
 
    // Setter
    @Value("${student.age}") public void setAge(int age)
    {
        this.age = age;
    }
 
    // Method
    public void display()
    {
 
        // Display message only
        System.out.println("Roll No: " + rollNo);
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

Regrese el programa nuevamente y obtendrá el resultado como se muestra a continuación:

Producción:

Roll No: 0
Name: Asish
Age: 30

Publicación traducida automáticamente

Artículo escrito por AmiyaRanjanRout 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 *