Spring的注解类型Required已经被弃用

14

Spring的注解类型Required已被标记为废弃。

废弃: 自5.1版本起,建议使用构造函数注入来设置必需参数(或自定义InitializingBean实现)。

相关的RequiredAnnotationBeanPostProcessor也一样。

但是目前还不清楚替代方案,似乎不再提供此功能。

这个变化是否防止我们将方法标记为“必需”,除非它是构造函数的一部分?以防止在类创建时出现意外异常?

2个回答

25

有三种方法可以通过注释来注入bean:

字段注入

@Autowired
private FooService fooService;

Setter注入

private FooService fooService;

@Autowired
public void setFooService(FooService fooService) {
    this.fooService = fooService
}

构造函数注入(这是提到的替代方式)

private final FooService fooService;

@Autowired
public MyComponent(FooService fooService) {
    this.fooService = fooService;
}

正如您所看到的,声明您的Service final 的唯一方法是使用构造函数注入,该方法替换了@Required注释,因为它强制类的用户使用必需的服务实例化它。用户不一定是Spring,也可以是一个简单的单元测试。

对于强制依赖项应使用构造函数注入,对于可选依赖项应使用setter注入,而不是字段注入。以下是一些原因:

  • 它能让所有人清楚地知道哪些依赖项是必需的
  • 它使测试更容易
  • 您可以使对象不可变

进一步阅读:

更新:未注释的构造函数注入

当一个评论者对使用@Autowired注释的final字段,而构造函数没有注释时产生疑问时:

如果一个类一开始只声明了一个构造函数,则它将始终被使用,即使没有注释。

https://docs.spring.io/spring-framework/docs/5.2.5.RELEASE/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html(“Autowired Constructors”)

但是,即使在这种情况下不必注释构造函数,我仍然会这样做:它可以为代码提供文档,并且如果有人添加了另一个(未注释的)构造函数,代码仍将正常工作。


我已经使我的用户DAO标记为final,尽管是通过注册服务中的字段注入的。构造函数需要存在。这是否提供了一种与最终注释功能相同的肮脏方法,就像在构造函数上使用@Autowired注释一样? - user3625699
1
@user3625699 如果你的类只有一个构造函数,Spring 将始终使用它,即使它没有用 @Autowired 注释。因此,实际上你正在使用构造函数注入,而注释字段是无意义的(甚至可能会误导)。我建议你用 @Autowired 注释你的构造函数,即使 Spring 不要求你这样做。这将记录你的意图,如果你或其他人添加了另一个(未注释的)构造函数,代码仍将正常工作。 - qutax
我知道这个问题很老了,但我刚刚发现了一段代码,可能对我正在处理的工作有用。它在一个非Spring管理的Bean中具有必需的注释。如果我将其替换为使用@Autowired的构造函数注入,则会收到警告,提示它必须在Spring管理的Bean内使用。 - Anjil Dhamala

2

是的,它已经被弃用了,但您仍然可以在xml文件中使用它,方法如下:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />

2
我已经要求更换,所以你的回答在这里是无关紧要的。 - user7294900

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接