首页 > 解决方案 > 为什么我应该在抽象类的 @Autowired 方法上使用 final 关键字?

问题描述

我正在阅读在抽象类中使用 @Autowired。在这里,我无法理解“当我们在setter方法上使用@Autowired时,我们应该使用final关键字,这样子类就不能覆盖setter方法。否则,注释将无法按预期工作。 ”。(试图找到一些例子,但找不到一个)

你能给我一个意外工作场景的例子吗?

标签: spring

解决方案


这是一个显示问题的最小示例:

@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。如果您注释覆盖的方法并保留基本方法,则一切都会按预期进行。


推荐阅读