Spring的注解类型Required已被标记为废弃。
废弃: 自5.1版本起,建议使用构造函数注入来设置必需参数(或自定义InitializingBean实现)。
相关的RequiredAnnotationBeanPostProcessor也一样。
但是目前还不清楚替代方案,似乎不再提供此功能。
这个变化是否防止我们将方法标记为“必需”,除非它是构造函数的一部分?以防止在类创建时出现意外异常?
Spring的注解类型Required已被标记为废弃。
废弃: 自5.1版本起,建议使用构造函数注入来设置必需参数(或自定义InitializingBean实现)。
相关的RequiredAnnotationBeanPostProcessor也一样。
但是目前还不清楚替代方案,似乎不再提供此功能。
这个变化是否防止我们将方法标记为“必需”,除非它是构造函数的一部分?以防止在类创建时出现意外异常?
有三种方法可以通过注释来注入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”)
但是,即使在这种情况下不必注释构造函数,我仍然会这样做:它可以为代码提供文档,并且如果有人添加了另一个(未注释的)构造函数,代码仍将正常工作。
是的,它已经被弃用了,但您仍然可以在xml文件中使用它,方法如下:
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />
@Autowired
注释。因此,实际上你正在使用构造函数注入,而注释字段是无意义的(甚至可能会误导)。我建议你用@Autowired
注释你的构造函数,即使 Spring 不要求你这样做。这将记录你的意图,如果你或其他人添加了另一个(未注释的)构造函数,代码仍将正常工作。 - qutax