Spring @Required注解是否已被弃用?对应的替代注解是什么
@Required 注解弃用后的替代方案
Spring 5.1 版本起@Required注解正式被标记为弃用,原注解的核心作用是标记Bean的Setter方法必须被Spring容器完成属性注入,否则容器启动阶段就会抛出BeanInitializationException。以下是可实现同等功能的替代方案:
- 方案1:构造器注入(官方首推)
Spring团队目前优先推荐使用构造器注入的方式处理必填属性,无需额外注解即可保证属性必须被赋值,同时还能将属性声明为不可变类型。代码示例如下:
public class Product { private final String id; // Spring 4.3+ 若类仅存在一个构造器,无需额外添加@Autowired注解 public Product(String id) { this.id = id; } public String getId() { return id; } }
这种方式从语法层面就强制实例化对象时必须传入id参数,从根源上避免了必填属性未赋值的问题,也符合不可变对象的设计规范。
- 方案2:
@Autowired(required = true)(Setter注入场景适配)
如果项目代码必须保留Setter注入的写法,可以直接将原@Required替换为@Autowired(required = true),Spring容器会自动校验对应属性必须完成注入,效果和原@Required完全一致。代码示例如下:
import org.springframework.beans.factory.annotation.Autowired; public class Product { private String id; public String getId() { return id; } @Autowired(required = true) public void setId(String id) { this.id = id; } }
- 方案3:JSR-380校验注解
@NotNull(运行时属性校验场景)
如果不仅需要容器注入层面的校验,还需要做通用的参数非空校验,可以配合Spring的@Validated注解使用javax.validation.constraints.NotNull(Jakarta EE环境对应jakarta.validation.constraints.NotNull)实现更强的校验能力。代码示例如下:
import javax.validation.constraints.NotNull; import org.springframework.validation.annotation.Validated; @Validated public class Product { @NotNull private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } }
该方案除了Spring容器注入场景外,也可以对其他场景传入的属性值做非空校验。
内容的提问来源于stack exchange,提问作者swapnil
相关产品推荐
相关产品推荐

