构造器注入通过构造函数传入依赖,确保对象创建时依赖完整,适合必需依赖;Setter注入通过setter方法设置依赖,灵活支持可选或可变依赖。示例中UserService通过构造器或setter注入UserRepository,分别实现不可变和可变依赖管理。实际开发推荐优先使用构造器注入保证对象完整性,Setter注入用于可选场景,Spring等框架均支持,合理选择可提升代码可维护性与可测试性。

在Java中,依赖注入(Dependency Injection, DI)是一种常用的设计模式,用于实现控制反转(IoC),提升代码的可测试性和可维护性。最常见的两种注入方式是构造器注入和Setter注入。下面介绍如何使用这两种方式初始化对象。
构造器注入(Constructor Injection)
构造器注入通过类的构造函数传入依赖对象,确保对象创建时所需依赖必须提供,有助于构建不可变且完整的对象。
特点: 依赖不可变、强制依赖明确、适合必需依赖。
示例:
立即学习“Java免费学习笔记(深入)”;
假设有一个UserService类,它依赖于UserRepository:
class UserRepository {
public void save(String user) {
System.out.println("保存用户: " + user);
}
}
class UserService {
private final UserRepository userRepository;
// 构造器注入
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void addUser(String name) {
userRepository.save(name);
}
}使用时直接通过构造器传入依赖:
```java UserRepository repo = new UserRepository(); UserService service = new UserService(repo); // 注入依赖 service.addUser("Alice"); ```Setter注入(Setter Injection)
Setter注入通过setter方法设置依赖,对象创建后可以动态更改依赖关系。
特点: 灵活、支持可选依赖、适合后期修改依赖的场景。
示例:
立即学习“Java免费学习笔记(深入)”;
同样是上面的类,改为使用setter方式注入:
class UserService {
private UserRepository userRepository;
// Setter注入
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void addUser(String name) {
if (userRepository == null) {
throw new IllegalStateException("UserRepository 未初始化");
}
userRepository.save(name);
}
}使用时先创建对象,再通过setter设置依赖:
```java UserService service = new UserService(); service.setUserRepository(new UserRepository()); // 注入依赖 service.addUser("Bob"); ```如何选择?
实际开发中,应根据需求选择合适的注入方式:
- 优先使用构造器注入处理必需依赖,保证对象状态完整。
- 使用Setter注入处理可选依赖或允许运行时更换依赖的场景。
- 在Spring等框架中,两者都支持,但现代推荐以构造器注入为主。
基本上就这些。合理使用构造器和setter注入,能让代码更清晰、更易管理。










