我正在阅读在抽象类中使用@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。如果您注释了被覆盖的方法并保留了基方法,那么一切都会如预期的那样工作。