📜  带有示例的 Spring @Required 注解

📅  最后修改于: 2022-05-13 01:54:25.496000             🧑  作者: Mango

带有示例的 Spring @Required 注解

Spring Annotations允许我们通过Java程序配置依赖并实现依赖注入。这些是提供有关程序数据的元数据的一种形式。 spring 中的@Required 注解是一个方法级别的注解,用于 bean 属性的 setter 方法,因此强制 setter-injection。这个注解表明必需的 bean 属性必须在配置时注入一个值,我们将在下面的示例中展示和解释。

执行:

第 1 步:首先,让我们创建一个简单的 Spring Application 并通过 setter 注入来注入字面量值。因此,创建一个简单的 Student 类,它具有三个属性 rollNo、name 和 age。为这两个属性创建 setter 方法和打印学生详细信息的简单方法。

档案:学生。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);
    }
}


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);
    }
}


XML


 
    
      
 
    
 
    
   


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();
    }
}


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);
    }
}


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);
    }
}


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);
    }
}


第2步:让我们在你的类路径中创建一个属性文件,并将文件命名为student-info.properties (对于这个例子我们这样命名,你可以根据你的需要命名)。在这个文件中,我们要写这样的东西

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

第 3 步:让我们使用 @Value 注释从属性文件中设置值。所以,我们可以修改我们的学生。 Java文件是这样的

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);
    }
}

第 4 步:现在让我们在 beans.xml 文件中创建一个学生 Bean。下面是beans.xml文件的完整代码

XML



 
    
      
 
    
 
    
   

第5步:现在我们的bean准备好了。现在让我们创建一个类并在该类中定义 main() 方法。假设我们创建了一个名为 Main 的类,并且我们在该类中定义了 main() 方法。下面是Main 的代码。 Java类。代码中添加了注释以便更好地理解。

A. 文件:主要。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();
    }
}

现在运行你的 main() 方法,输出将是这样的。

输出:

Roll No: 201
Name: Asish
Age: 30

所以我们的应用程序运行良好。现在让我们再来看看学生。 Java文件并删除 setRollNo() 方法之前的 @Value(“${student.rollNo}”)。所以现在我们修改后的学生。 Java文件是这样的,如下所示:

B. 档案:学生。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);
    }
}

现在再次运行您的 main() 方法,输出将是这样的。

输出:

Roll No: 0
Name: Asish
Age: 30

因此创建了 Student 类对象,但尚未分配 Roll no 值。但是我们希望在创建 Student 类对象之前必须填充 Roll No 值。您可以认为 Roll no 是主键,我们不希望此值为 null。所以这里@Required Annotation出现了。所以如果我们修改我们的学生。 Java文件如下所示,我们将在程序中获取异常。

C. 档案:学生。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);
    }
}

例外:

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.(ClassPathXmlApplicationContext.java:144)
    at org.springframework.context.support.ClassPathXmlApplicationContext.(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

所以在这种情况下,异常控制台试图告诉我们必须向 Roll no 提供值才能创建 Student 类对象。因此,如果您希望某些字段值必须填充某些值,那么您应该使用@Required Annotation。所以我们可以修改我们的学生。 Java文件如下所示:

D. 档案:学生。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);
    }
}

再次返回程序,您将获得如下所示的输出:

输出:

Roll No: 0
Name: Asish
Age: 30