java - Spring 的注解类型需要弃用
问题描述
Spring 的Annotation Type Required被标记为 deprecated
已弃用。 从 5.1 开始,支持将构造函数注入用于所需设置(或自定义 InitializingBean 实现)
相关的RequiredAnnotationBeanPostProcessor相同
但是不清楚替换的是什么,似乎应该是不可用的。
除非它是构造函数方法的一部分,否则此更改是否会阻止我们根据需要标记方法?防止类创建时出现意外异常?
解决方案
通过注解注入 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 注入,而不是字段注入。一些原因:
- 它让每个人都清楚需要哪些依赖项
- 它使测试更容易
- 你可以让你的对象不可变
进一步阅读:
- http://olivergierke.de/2013/11/why-field-injection-is-evil/
- https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/
- https://spring.io/blog/2007/07/11/setter-injection-versus-constructor-injection-and-the-use-of-required/
更新:非注解构造函数注入
正如一位评论员想知道一个在构造函数没有注释的情况下被注释的final
字段:@Autowired
如果一个类只声明了一个构造函数,即使没有注释,它也会一直被使用。
但是即使在这种情况下不需要注释构造函数,我仍然会这样做:它记录代码,如果有人会添加另一个(未注释的)构造函数,代码仍然可以工作。
推荐阅读
- recursion - 递归拆解字符串时避免stackoverflow
- c++ - 类名类对象();不调用任何构造函数
- html - 如何只选择最后一个
在一个
? - database - 数据库表设计 - 扁平化关系与嵌套关系
- tensorflow - Tensorboard 没有运行时元数据
- git - 如何对不应该推送到远程存储库的文件进行版本控制?
- sql - OPENQUERY 删除在哪里
- oracle-sqldeveloper - 在 SQL Developer 中执行 Sybase ASE 过程
- powershell - 远程会话上的 Invoke-Command 返回本地值
- node.js - 如何读取和写入位于 s3 存储桶上的 .txt 文件?