构造器注入与 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 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。