Spring Boot依赖注入的 3 种方式

在 Spring Boot 中,依赖注入是一种用于实现类之间松耦合的机制。Spring 提供了三种主要的依赖注入方式:构造函数注入setter方法注入、以及字段注入。下面我们逐一介绍这三种方式及如何使用它们。

1. 构造函数注入

构造函数注入是最推荐的依赖注入方式,因为它确保所有必需的依赖在对象创建时就被提供,并且避免了依赖注入时的可变性问题。

使用示例:
 @Service
 public class UserService {
 ​
     private final UserRepository userRepository;
 ​
     // 使用构造函数注入
     public UserService(UserRepository userRepository) {
         this.userRepository = userRepository;
     }
 ​
     public User findById(Long id) {
         return userRepository.findById(id).orElse(null);
     }
 }

优点:

  • 不可变性:通过 final 修饰符确保依赖不会在之后被改变。

  • 更易测试:构造函数注入便于在单元测试中进行依赖的模拟(Mock)。

  • 清晰的依赖关系:构造函数明确地展示了类的依赖,便于阅读和维护。

2. Setter方法注入

Setter方法注入允许通过类的 Setter 方法注入依赖。这种方式常用于可选的依赖或有默认值的依赖。

使用示例:
 @Service
 public class UserService {
 ​
     private UserRepository userRepository;
 ​
     // 无参构造函数
     public UserService() {
     }
 ​
     // Setter方法注入
     @Autowired
     public void setUserRepository(UserRepository userRepository) {
         this.userRepository = userRepository;
     }
 ​
     public User findById(Long id) {
         return userRepository.findById(id).orElse(null);
     }
 }

优点:

  • 适用于可选依赖:可以在运行时动态地注入依赖。

  • 灵活性:对象创建后仍可通过 setter 方法注入或更改依赖。

缺点:

  • 依赖可能在对象创建之后才被设置,可能导致空指针异常(NullPointerException)。

  • 不适合强制性的依赖。

3. 字段注入

字段注入使用 @Autowired 注解直接在类的字段上注入依赖。这是最直接的注入方式,但通常不被推荐,因为它降低了类的可测试性和可维护性。

使用示例:
 @Service
 public class UserService {
 ​
     // 字段注入
     @Autowired
     private UserRepository userRepository;
 ​
     public User findById(Long id) {
         return userRepository.findById(id).orElse(null);
     }
 }

优点:

  • 简洁:代码看起来更简洁,无需编写构造函数或 setter 方法。

缺点:

  • 难以测试:使用字段注入的类在单元测试中不易模拟依赖。

  • 可维护性差:依赖关系在类中不明显,不如构造函数注入清晰。

  • 潜在的安全问题:由于依赖是通过反射注入的,难以控制依赖是否已经被正确注入。

如何选择?

  • 构造函数注入:首选方式,适用于所有必须的依赖,确保类在创建时具有所有必需的依赖。

  • Setter方法注入:适用于可选依赖或在运行时可能变化的依赖。

  • 字段注入:尽量避免使用,除非非常简单的情况。一般不推荐用于生产代码中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值