首页 > 解决方案 > Spring 的注解类型需要弃用

问题描述

Spring 的Annotation Type Required被标记为 deprecated

已弃用。 从 5.1 开始,支持将构造函数注入用于所需设置(或自定义 InitializingBean 实现)

相关的RequiredAnnotationBeanPostProcessor相同

但是不清楚替换的是什么,似乎应该是不可用的。

除非它是构造函数方法的一部分,否则此更改是否会阻止我们根据需要标记方法?防止类创建时出现意外异常?

标签: javaspringdeprecated

解决方案


通过注解注入 bean 的方式有以下三种:

现场注入

@Autowired
private FooService fooService;

二传手注入

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 注入,而不是字段注入。一些原因:

  • 它让每个人都清楚需要哪些依赖项
  • 它使测试更容易
  • 你可以让你的对象不可变

进一步阅读:

更新:非注解构造函数注入

正如一位评论员想知道一个在构造函数没有注释的情况下被注释的final字段:@Autowired

如果一个类只声明了一个构造函数,即使没有注释,它也会一直被使用。

https://docs.spring.io/spring-framework/docs/5.2.5.RELEASE/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html(“自动装配构造函数”)

但是即使在这种情况下不需要注释构造函数,我仍然会这样做:它记录代码,如果有人会添加另一个(未注释的)构造函数,代码仍然可以工作。


推荐阅读