spring - 为什么我应该在抽象类的 @Autowired 方法上使用 final 关键字?
问题描述
我正在阅读在抽象类中使用 @Autowired。在这里,我无法理解“当我们在setter方法上使用@Autowired时,我们应该使用final关键字,这样子类就不能覆盖setter方法。否则,注释将无法按预期工作。 ”。(试图找到一些例子,但找不到一个)
你能给我一个意外工作场景的例子吗?
解决方案
这是一个显示问题的最小示例:
@SpringBootApplication
@RestController
public class DemoApplication extends AutowiredBase {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping
public String get() {
return timeProvider.getTime();
}
@Override
public void setTimeProvider(final TimeProvider timeProvider) {
// never called, because this method is not autowired
super.setTimeProvider(timeProvider);
}
}
@Component
class TimeProvider {
public String getTime() {
return Instant.now().toString();
}
}
class AutowiredBase {
protected TimeProvider timeProvider;
@Autowired
public void setTimeProvider(final TimeProvider timeProvider) {
System.out.println("Autowiring time provider");
this.timeProvider = timeProvider;
}
}
DemoApplication#setTimeProvider
永远不会被调用,因此调用该get()
方法将导致 NPE。如果您注释覆盖的方法并保留基本方法,则一切都会按预期进行。
推荐阅读
- tomcat - Spring Boot 嵌入式 tomcat 配置
- jquery - signalR 无限负载
- html - Colspan 没有按预期工作(没有 CSS)
- sql - SQL:如何在 sql 中为提供的数据获取这种类型的结果集
- jsonnet - 在 jsonnet 中导入 YAML
- android - 使用 NDK (JNI) 时的应用程序设计
- c# - 换行符未添加到字符串
- python - 如何使用具有 3D 分类输入和输出的 LSTM 神经网络?
- mysql - mysql联合查询在每个联合上具有单独的别名
- javascript - 如何将纯 javascript 重写为反应组件(foreach)