带有示例的 Spring @Required 注解
Spring Annotations允许我们通过Java程序配置依赖并实现依赖注入。这些是提供有关程序数据的元数据的一种形式。 spring 中的@Required 注解是一个方法级别的注解,用于 bean 属性的 setter 方法,因此强制 setter-injection。这个注解表明必需的 bean 属性必须在配置时注入一个值,我们将在下面的示例中展示和解释。
Prerequisites:
- Spring – Injecting Literal Values By Setter Injection
- Spring – How to Load Literal Values from Properties File
- Spring @Value Annotation with Example
执行:
第 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