当前位置: 首页 > news >正文

SpringBoot的Bean类三种注入方式(附带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 {@Autowiredprivate MyRepository repository;// ...
}

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

3. Setter 方法注入(Setter Injection)

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

@Service
public class MyService {private MyRepository repository;@Autowiredpublic 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 框架的发展,官方越来越倾向于推荐构造函数注入,因为它能够更好地满足现代软件开发的最佳实践。

http://www.lryc.cn/news/500528.html

相关文章:

  • 开源向量数据库介绍说明
  • 【前端】深度解析 JavaScript 中的 new 关键字与构造函数
  • 2024年华中杯数学建模C题基于光纤传感器的平面曲线重建算法建模解题全过程文档及程序
  • 使用 `typing_extensions.TypeAlias` 简化类型定义:初学者指南
  • 如何快速批量把 PDF 转为 JPG 或其它常见图像格式?
  • 如何在组织中塑造和强化绩效文化?
  • OllyDbg、CE简单介绍
  • Python函数——函数的返回值定义语法
  • 【Pandas】pandas isna
  • mysql 数据库表的大小
  • (6)JS-Clipper2之ClipperOffset
  • 如何在Ubuntu中利用repo和git地址下载获取imx6ull的BSP
  • Ruby On Rails 笔记5——常用验证下
  • JS听到了因果的回响
  • 【高中生讲机器学习】28. 集成学习之 Bagging 随机森林!
  • 硬件设计 | Altium Designer软件PCB规则设置
  • 【Elasticsearch】实现用户行为分析
  • python字符串处理基础操作总结
  • 电子商务人工智能指南 6/6 - 人工智能生成的产品图像
  • 【论文阅读】相似误差订正方法在风电短期风速预报中的应用研究
  • 贪心算法 - 学习笔记 【C++】
  • 精确的单向延迟测量:使用普通硬件和软件
  • 【MySQL 进阶之路】存储引擎和SQL优化技巧分析
  • vue+elementUI从B页面回到A页面并且定位到A页面的el-tabs的某个页签
  • {结对编程/大模型} 实践营项目案例 | 基于RAG搭建政策问答智能聊天助手
  • 【Canvas与图标】乡土风金属铝边立方红黄底黑字图像处理图标
  • 【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现
  • C++实现一个经典计算器(逆波兰算法)附源码
  • Python知识分享第二十二天-数据结构入门
  • 【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容