SpringBoot的Bean类三种注入方式详解

 更新时间:2024年12月11日 09:38:32   作者:漫天转悠  
在 Spring Boot 中,Bean 的注入方式主要包括构造函数注入(Constructor Injection)、字段注入(Field Injection)以及 Setter 方法注入(Setter Injection),以下是这几种注入方式的详细介绍,并附上 Lombok 的注入方式,需要的朋友可以参考下

SpringBoot的Bean类三种注入方式(附带LomBok注入)

在 Spring Boot 中,Bean 的注入方式主要包括构造函数注入(Constructor Injection)、字段注入(Field Injection)以及 Setter 方法注入(Setter Injection)。每种注入方式都有其特点和适用场景。此外,Lombok 提供了一种简化依赖注入的方式,能够减少样板代码,提高开发效率。以下是这几种注入方式的详细介绍,并附上 Lombok 的注入方式。

1. 构造函数注入(Constructor Injection)

使用场景:构造函数注入是 Spring 官方推荐的首选依赖注入方式,特别适用于强制性依赖项的注入。它确保了所有必需的依赖项在对象创建时就已经存在,并且一旦对象被创建后,这些依赖项就不能再被更改,从而保证了对象状态的一致性和不可变性。构造函数注入还可以帮助解决循环依赖的问题,因为 Spring 会在检测到循环依赖时抛出异常,迫使开发者解决这个问题。

@Service
public class MyService {
    private final MyRepository repository;

    @Autowired // 可选,Spring 4.3+ 版本中可以省略
    public MyService(MyRepository repository) {
        this.repository = repository;
    }

    // ...
}

构造函数注入的一个显著优势在于它可以与 final 关键字结合使用,使得依赖项成为不可变的属性,增强了代码的安全性和可读性。对于那些需要确保依赖项在整个对象生命周期内都不会改变的场景,构造函数注入是非常理想的选择。

2. 字段注入(Field Injection)

使用场景:字段注入是一种简单直接的方式,通过在类的私有字段上添加 @Autowired 注解来实现依赖注入。这种方式的优点在于代码简洁,易于阅读,特别适合于小型项目或原型开发阶段。然而,字段注入也存在一些潜在的风险,比如可能导致空指针异常,因为它允许对象在未完全初始化的情况下被使用。此外,字段注入还可能引发循环依赖的问题,并且不利于单元测试,因为无法轻松地为依赖项提供模拟实现。

@Service
public class MyService {
    @Autowired
    private MyRepository repository;

    // ...
}

尽管字段注入在某些情况下非常方便,但它并不是最佳实践,尤其是在大型项目中,应该尽量避免使用字段注入,转而采用更加安全可靠的构造函数注入或 Setter 方法注入。

3. Setter 方法注入(Setter Injection)

使用场景:Setter 方法注入允许通过调用类中的 Setter 方法来设置依赖项,通常用于非强制性依赖项的注入。这种方式提供了更大的灵活性,因为它允许在对象创建之后重新配置或更新依赖项。这对于那些需要动态调整依赖关系的场景非常有用,例如,在应用程序运行期间根据用户输入或其他外部条件来改变某些行为。不过,Setter 方法注入也有一定的局限性,比如它可能会导致对象处于不完整的状态,直到所有的 Setter 方法都被调用为止。

@Service
public class MyService {
    private MyRepository repository;

    @Autowired
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }

    // ...
}

Setter 方法注入的一个重要优点是它支持多参数的依赖注入,当一个类有多个依赖项时,使用 Setter 方法注入可以使代码更加清晰易懂。此外,Setter 方法注入还允许在不修改现有代码的情况下添加新的依赖项,这对于维护和扩展已有系统非常重要。

4. 使用 Lombok 进行依赖注入

使用场景:Lombok 是一款流行的 Java 库,旨在减少样板代码,提高开发效率。它可以通过注解自动生成常见的 getter、setter、构造函数等方法,从而简化依赖注入的过程。Lombok 支持两种主要的依赖注入方式:构造函数注入和 Setter 方法注入。使用 Lombok 可以显著减少手动编写重复代码的工作量,使代码更加简洁明了。

构造函数注入

Lombok 提供了 @RequiredArgsConstructor 注解,它可以为所有 final 或者带有 @NonNull 标记但未初始化的字段生成一个构造函数。这个构造函数会自动带上 @Autowired 注解,从而实现依赖注入。这种方式不仅减少了代码量,还保持了构造函数注入的安全性和不可变性特性。

@Service
@RequiredArgsConstructor(onConstructor_ = @__(@Autowired)) // 适用于 Spring 4.3 以下版本
// 对于 Spring 4.3 及以上版本可以直接使用 @RequiredArgsConstructor
public class MyService {
    private final MyRepository repository;
}

Setter 方法注入

Lombok 也支持通过 @Setter 注解来自动生成 Setter 方法,并且可以在生成的 Setter 方法上自动添加 @Autowired 注解。这种方式特别适合那些需要在对象创建后动态调整依赖关系的场景。不过,需要注意的是,Setter 方法注入可能会导致对象处于不完整状态的风险,因此应谨慎使用。

@Service
@Setter(onMethod_ = @Autowired)
public class MyService {
    private MyRepository repository;
}

总结

综上所述,构造函数注入、字段注入和 Setter 方法注入各有优劣,适用于不同的场景。构造函数注入因其安全性、不可变性和对循环依赖的有效处理而成为首选;字段注入虽然简单但存在风险,更适合快速开发和小型项目;Setter 方法注入则提供了额外的灵活性,适合那些需要动态调整依赖关系的应用程序。Lombok 的引入进一步简化了依赖注入的过程,减少了样板代码,提高了开发效率。开发者应当根据项目的具体需求和个人偏好,合理选择最适合的注入方式。值得注意的是,随着 Spring 框架的发展,官方越来越倾向于推荐构造函数注入,因为它能够更好地满足现代软件开发的最佳实践。

以上就是SpringBoot的Bean类三种注入方式详解的详细内容,更多关于SpringBoot Bean类注入方式的资料请关注脚本之家其它相关文章!

相关文章

  • MyBatis解决模糊查询包含特殊字符问题

    MyBatis解决模糊查询包含特殊字符问题

    这篇文章主要介绍了MyBatis解决模糊查询包含特殊字符问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 关于Openfire集群源码的分析

    关于Openfire集群源码的分析

    这篇文章主要介绍了关于Openfire集群源码的分析,内容比较详细,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • 简单谈谈Java类与类之间的关系

    简单谈谈Java类与类之间的关系

    类与类之间的关系对于理解面向对象具有很重要的作用,以前在面试的时候也经常被问到这个问题,在这里我就简单给大家介绍一下。
    2016-05-05
  • springboot开启mybatis二级缓存的步骤详解

    springboot开启mybatis二级缓存的步骤详解

    这篇文章给大家介绍了springboot开启mybatis二级缓存的详细步骤,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • @Transactional用法详解与事务避坑指南

    @Transactional用法详解与事务避坑指南

    这篇文章主要介绍了@Transactional用法与事务避坑指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-10-10
  • Java8 Optional的详细使用教程

    Java8 Optional的详细使用教程

    这篇文章主要给大家介绍了关于Java8 Optional的详细使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • vscode快速引入第三方jar包发QQ邮件

    vscode快速引入第三方jar包发QQ邮件

    这篇文章主要介绍了vscode快速引入第三方jar包发QQ邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Spring Boot 整合原生 WebSocket的实际操作

    Spring Boot 整合原生 WebSocket的实际操作

    文章介绍了WebSocket协议的基本概念、特点及在Spring Boot中的整合步骤,通过示例代码和实际操作,展示了如何配置WebSocket处理器、握手拦截器、会话管理和服务类,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • java多线程编程学习(线程间通信)

    java多线程编程学习(线程间通信)

    下面小编就为大家带来一篇java多线程编程学习(线程间通信)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Spring Boot的测试类中使用 @Transactional 注解

    Spring Boot的测试类中使用 @Transactional 注解

    本文主要介绍了Spring Boot的测试类中使用 @Transactional 注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05

最新评论