构造器注入是实现对象解耦最直接、最可靠的方式,通过将依赖作为final构造参数传入,使类仅依赖接口、不关心具体实现,支持零修改替换实现,并天然适配spring等容器或手工工厂管理。

构造器注入是实现对象解耦最直接、最可靠的方式。它把依赖关系显式声明在类的创建入口,让调用方决定传入哪个具体实现,而被注入类只面向接口或抽象类型工作,完全不感知底层细节。
明确依赖边界:只依赖接口,不依赖实现
解耦的前提是“面向接口编程”。先定义行为契约,再提供多种实现:
- 声明 UserRepository 接口,只包含
findById(Long id)方法 - 提供 JdbcUserRepository(查数据库)、CacheUserRepository(加缓存)等多个实现类
- UserService 的构造器只接收 UserRepository 类型参数,不关心具体是谁
构造器注入写法:强制初始化 + final 保障
把依赖作为构造器参数传入,并用 final 修饰字段,确保不可变性和空安全:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 字段声明为
private final UserRepository userRepository; - 构造器中完成赋值:
this.userRepository = userRepository; - 这样 UserService 实例一旦创建,依赖就已就位,后续所有方法调用都无需检查 null
替换实现零修改:解耦带来的真实好处
当需要切换数据源时,只需改变构造时传入的对象,其他代码完全不动:
- 原来:new UserService(new JdbcUserRepository(dataSource))
- 现在:new UserService(new CacheUserRepository(new JdbcUserRepository(dataSource)))
- 甚至可换成 new UserService(new MockUserRepository()) 用于单元测试
- UserService 类本身一行代码都不用改
配合工厂或容器使用更自然
手动 new 多层嵌套虽可行,但项目变大后推荐交由容器管理:
- Spring 中用
@Autowired标记构造器,容器自动匹配并注入符合条件的 Bean - Guice 或 Dagger 同样支持构造器绑定,通过模块配置指定接口与实现的映射
- 哪怕不用框架,也可自己写简单工厂,把对象组装逻辑集中管理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










