推荐答案
Spring 支持以下三种类型的依赖注入:
构造器注入(Constructor Injection)
通过构造器参数注入依赖项。Spring 容器会在创建 Bean 时调用相应的构造器,并将依赖项作为参数传递。Setter 注入(Setter Injection)
通过调用 Bean 的 Setter 方法注入依赖项。Spring 容器会在创建 Bean 后调用相应的 Setter 方法,将依赖项传递给 Bean。字段注入(Field Injection)
通过直接注入字段的方式注入依赖项。Spring 容器会使用反射机制直接将依赖项注入到 Bean 的字段中。
本题详细解读
1. 构造器注入
构造器注入是通过类的构造器来注入依赖项。这种方式强制要求在创建对象时必须提供所有必需的依赖项,因此可以确保 Bean 在初始化时就是完整的。构造器注入的优点是:
- 依赖项不可变,适合注入不可变对象。
- 更容易进行单元测试,因为依赖项可以通过构造器直接传入。
示例代码:
public class UserService { private final UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } }
2. Setter 注入
Setter 注入是通过调用 Bean 的 Setter 方法来注入依赖项。这种方式允许在 Bean 创建后动态地注入依赖项,适合可选依赖项的场景。Setter 注入的优点是:
- 灵活性高,可以在运行时动态更改依赖项。
- 适合注入可选依赖项。
示例代码:
public class UserService { private UserRepository userRepository; @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } }
3. 字段注入
字段注入是通过直接注入字段的方式注入依赖项。这种方式不需要显式地调用构造器或 Setter 方法,Spring 容器会自动完成注入。字段注入的优点是:
- 代码简洁,不需要额外的构造器或 Setter 方法。
- 适合快速开发和原型设计。
示例代码:
public class UserService { @Autowired private UserRepository userRepository; }
总结
Spring 提供了多种依赖注入方式,开发者可以根据具体需求选择合适的方式。构造器注入适合强制依赖项,Setter 注入适合可选依赖项,而字段注入则适合快速开发和简洁代码的场景。