Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

构造器注入与 setter 注入怎样选择?

查看完整题解

参考回答

直接回答

构造器注入在创建对象时提供依赖,适合必需依赖,便于用 final 字段保持引用稳定;setter 注入在创建后设置依赖,适合真正可选或需要重新配置的情况。多数必需依赖优先通过构造器表达,但不存在所有场景都只能用一种方式的规则。

讲清原理

依赖注入的核心是由外部提供协作者,不要求必须使用 Spring。测试时可以传入替代实现,而不让业务类自己固定创建数据库连接或网络客户端。

构造器明确表达“没有这个协作者,对象就不能正常工作”。setter 方式则必须处理尚未设置、重复设置以及重新配置时的并发问题。大量构造参数也可能提示职责过多,不宜用 setter 把问题藏起来。

例子与易错点

interface Sender { void send(); }
class Service {
    private final Sender sender;
    Service(Sender sender) {
        this.sender = java.util.Objects.requireNonNull(sender);
    }
    void run() { sender.send(); }
}
new Service(() -> System.out.println("已发送")).run();

Spring 也建议用构造器表达必需依赖、用 setter 表达可选依赖。构造器循环依赖常暴露设计问题;能否绕过它不是选择注入方式的唯一依据。final 只固定引用,不保证依赖对象内部不可变。

相关题:第 11 题、第 19 题、第 27 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。