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

最新更新