📜  Spring – 必需的注解

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

Spring – 必需的注解

考虑一个开发人员想要将某些字段设为必填字段的场景。使用Spring 框架,开发人员可以通过将此类检查的责任推到容器上来对这些字段使用 @Required 注释。所以容器必须检查这些字段是否被设置。

  • Spring 框架支持许多自定义Java 5+ 注释。
  • 从 Spring 2.0 开始,开发人员可以通过在相关类、方法或字段声明上使用注释来对组件类本身进行配置,而不是使用 XML 来描述 bean 连接。
  • 它引入了使用 @Required 注释强制执行必需属性的可能性,并且可以注册为单独的 bean 定义。

@必填注解

1. @Required 注解自 2.0 起在org.springframework.beans.factory.annotation包中可用。

2.适用于bean属性setter方法。

3.它提供了一个方法级注解,该注解应用于 bean 属性 setter 方法,使 setter-injection 成为强制性。这意味着它可用于将属性标记为“需要设置”。

4.这样容器将检查一个类的注释(setter)方法,如果它被配置为依赖注入一个值或没有。如果没有,容器将在运行时抛出异常。

5.此注解表明受影响的 bean 属性必须在配置时填充:通过 bean 定义中的显式属性值或通过自动装配。

Java
@Deprecated
@Retention(value=RUNTIME)
@Target(value=METHOD)
public @interface Required


Java
@Deprecated
public class RequiredAnnotationBeanPostProcessor
extends Object
implements SmartInstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware


XML


  
    
  


XML


  
    
  


Java
package com.beans;
  
import org.springframework.beans.factory.annotation.Required;
  
public class SubjectBean {
  
    private Integer subId;
    private String subName;
  
    @Required
    public void setSubName(String subName) {
        this.subName = subName;
    }
  
    public String getSubName() {
        return subName;
    }
  
    public Integer getSubId() {
        return subId;
    }
  
    public void setSubId(Integer subId) {
        this.subId = subId;
    }
  
}


XML

  

      
    
      
    
    
      
    
      
    
      
    
        
        
    
  


Java
package com.test;
  
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
  
import com.beans.SubjectBean;
  
public class SubjectBeanTest {
  
    public static void main(String[] args) throws Exception {
  
        ApplicationContext con = new ClassPathXmlApplicationContext("com/resource/applicationContext.xml");
        SubjectBean subject = (SubjectBean) con.getBean("subjectBean");
          
        System.out.println("Welcome to GeeksforGeeks");
        System.out.println("Subject Name: "+ subject.getSubName());
        System.out.println("Subject ID: "+ subject.getSubId());
    }
  
}


XML

  

      
    
      
    
    
      
    
      
    
      
    
        
        
    
  


简单地注释类的“setter”属性不足以获得所需的行为,开发人员需要启用或激活 @Required 注释,以便它可以适当地处理。我们可以在 Spring XML 配置中通过两种方式启用 @Required 注解:

  • 通过在 bean 定义中注册RequiredAnnotationBeanPostProcessor
  • 或者可以通过在基于 XML 的 Spring 配置中包含标记来隐式注册。

方法一:RequiredAnnotationBeanPostProcessor

1. Spring 提供了 BeanPostProcessor 接口及其实现类,这些实现类强制要求已配置的 JavaBean 属性。

2.如果开发者想在Spring容器完成实例化、配置和初始化一个bean之后实现一些自定义逻辑,可以使用一个或多个BeanPostProcessor实现。

3.该接口定义了开发者可以实现的回调方法,以提供自己的实例化逻辑、依赖解析逻辑等。

一个例子是 Spring 的RequiredAnnotationBeanPostProcessor——一个特殊的 BeanPostProcessor 实现,它是 @Required 感知的,它确保用 @Required 注释标记的 JavaBean 属性必须用一个值进行依赖注入。

java.lang.Object
org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor
Class RequiredAnnotationBeanPostProcessor

插图:

Java

@Deprecated
public class RequiredAnnotationBeanPostProcessor
extends Object
implements SmartInstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware
  • 一旦在Spring XML配置文件中定义了RequiredAnnotationBeanPostProcessor,在完成一个bean的实例化、配置和初始化之后,容器会检查受影响的bean属性是否已经被填充,如果没有则抛出异常。
  • 这允许急切和明确的失败,并避免以后出现任何异常。

我们可以在 Spring XML 配置文件中使用RequiredAnnotationBeanPostProcessor,如下所示。

例子:

XML



  
    
  

方法二:context:annotation-config

1. 在定义它的同一应用程序上下文中查找 bean 上的注释。

2.这个主要用来激活@Required、@Autowired、@PostConstruct、@PreDestroy等依赖注入注解。

我们可以在 Spring XML 文件中使用 ,如下所示。

例子:

XML



  
    
  

实现:我们将使用 Spring 创建一个基本的Java应用程序来显示标题、主题名称和 ID。步骤如下:

  1. 创建一个Java应用程序并向其添加必要的 Spring 库文件。
  2. 创建一个 bean 类来定义属性、getter 和 setter 方法。
  3. 创建 Spring XML 配置文件。
  4. 创建一个测试类来运行应用程序。

第 1 步:创建Java应用程序并向其添加必要的 Spring 库文件

  • 在本例中,我们使用的是 Eclipse IDE。在 Eclipse 中创建Java应用程序。
  • 从 Maven Repository 下载必要的 Spring jar 文件并将它们添加到Java项目中。
  • 下面是创建所有必要类后的项目结构。

项目_结构

第 2 步:创建一个 bean 类来定义属性、getter 和 setter 方法。创建一个Java bean 类来定义所有必需的属性及其 getter/setter 方法。 ( Java)

例子:

Java

package com.beans;
  
import org.springframework.beans.factory.annotation.Required;
  
public class SubjectBean {
  
    private Integer subId;
    private String subName;
  
    @Required
    public void setSubName(String subName) {
        this.subName = subName;
    }
  
    public String getSubName() {
        return subName;
    }
  
    public Integer getSubId() {
        return subId;
    }
  
    public void setSubId(Integer subId) {
        this.subId = subId;
    }
  
}
  • 创建了一个名为“ SubjectBean ”的 JavaBean,它有两个属性subNamesubId。
  • subName的 setter 方法标记为 @Required,以便该属性必须设置一个值 - 一个必填字段。

第 3 步:创建 Spring XML 配置文件。要配置 bean 值,请在 XML 配置文件中定义这些值。

文件: applicationContext.xml

XML


  

      
    
      
    
    
      
    
      
    
      
    
        
        
    
  

  • 如前所述,我们可以使用任意一个 RequiredAnnotationBeanPostProcessor 或 context:annotation-config 来启用注解。
  • 为 SubjectBean 类创建一个 bean 对象,并使用属性标签设置参数值,如图所示。

第 4 步:创建一个测试类来运行应用程序。

创建SubjectBeanTest。 Java获取bean并打印属性值。

文件: SubjectBeanTest。Java

Java

package com.test;
  
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
  
import com.beans.SubjectBean;
  
public class SubjectBeanTest {
  
    public static void main(String[] args) throws Exception {
  
        ApplicationContext con = new ClassPathXmlApplicationContext("com/resource/applicationContext.xml");
        SubjectBean subject = (SubjectBean) con.getBean("subjectBean");
          
        System.out.println("Welcome to GeeksforGeeks");
        System.out.println("Subject Name: "+ subject.getSubName());
        System.out.println("Subject ID: "+ subject.getSubId());
    }
  
}
  • 创建 ApplicationContext 对象并获取 bean 对象。
  • 将属性值打印到控制台。

执行/输出:

  • 创建所需的类和 XML 文件后,将项目作为Java应用程序运行。
  • 输出应如下所示,

输出

  • 现在要检查 @Required 注释,删除/注释 XML 文件中subName的属性值,如下所示,

XML


  

      
    
      
    
    
      
    
      
    
      
    
        
        
    
  

  • 在这里,我们只是设置subId 的值。
  • 现在,再次将项目作为Java应用程序运行。我们会得到以下错误。

容器将检查属性subName是否已初始化。这里我们不设置值。因此,容器抛出异常说“bean 'subjectBean' 需要属性'subName'”

结论:通过这种方式,我们可以在 spring bean 中的 setter 方法中使用 @Required 注释,这样就可以让 spring 容器负责检查是否设置了所需的属性值。