news 2026/5/28 15:02:17

Spring的依赖注入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring的依赖注入

1. 依赖注入概述

依赖注入(DI)是 Spring 的核心概念之一,主要目的是解耦。通过依赖注入,Spring 可以将一个对象所需要的依赖关系注入给它,而不需要对象自己去管理依赖。Spring 提供了三种主要的依赖注入方式:

  • 构造器注入
  • Setter 注入
  • 字段注入

2. Spring 的依赖注入核心接口

Spring 通过BeanFactoryApplicationContext等接口来管理 Bean 的生命周期及依赖注入过程。BeanFactory是 Spring 容器的根接口,它负责 Bean 的实例化、管理和依赖注入。

2.1 BeanFactory 的核心方法

BeanFactory提供了getBean方法来获取 Bean,Spring 会通过这个方法来创建和管理 Bean 实例。

关键源码

java复制

public interface BeanFactory { Object getBean(String name) throws BeansException; }
  • getBean方法:根据给定的名称返回对应的 Bean 实例,Spring 容器会自动处理 Bean 的依赖注入。

3. Bean 的实例化与依赖注入

Spring 容器在加载 Bean 时会根据配置文件或者注解的方式为 Bean 实例注入所需的依赖。DefaultListableBeanFactory是 Spring 的默认实现类,负责实例化和管理所有的 Bean。

3.1 DefaultListableBeanFactory 的依赖注入流程

DefaultListableBeanFactory是 Spring 容器最核心的类之一,它实现了BeanFactory接口,负责实例化 Bean 和依赖注入。

关键源码

java复制

public class DefaultListableBeanFactory extends AbstractBeanFactory { @Override public Object getBean(String name) throws BeansException { // 根据名称获取 Bean 定义 BeanDefinition beanDefinition = getBeanDefinition(name); // 判断是否已经实例化,如果没有则创建新的实例 if (!beanDefinition.isSingleton()) { return createBean(beanDefinition); } return beanDefinition.getBeanClass().newInstance(); // 使用反射创建 Bean 实例 } }
  • getBean方法:通过反射创建 Bean 实例。
  • 如果 Bean 的定义为 singleton,则返回现有的实例。

4. 构造器注入

构造器注入是最常用的一种依赖注入方式,Spring 通过调用构造方法来注入 Bean 的依赖。

4.1 构造器注入实现

Spring 通过AutowiredAnnotationBeanPostProcessor处理注解@Autowired,并在实例化 Bean 时自动注入其构造器依赖。

关键源码
  • postProcessBeforeInitialization方法中,Spring 会检查 Bean 是否包含@Autowired注解,并通过反射调用构造方法进行依赖注入。
4.2 构造器注入的优点
  • 构造器注入相比于 Setter 注入有一个明显的优势——强制依赖。在构造器注入中,所有依赖项都必须在 Bean 实例化时传入,避免了依赖项未注入的情况。

5. Setter 注入

Setter 注入是另一种常用的依赖注入方式,它通过调用 setter 方法注入依赖。Spring 会在实例化 Bean 后,自动为具有@Autowired注解的 setter 方法注入依赖。

5.1 Setter 注入实现

Spring 会扫描所有 Bean 的 setter 方法,并通过反射进行注入。

关键源码
  • invokeSetterMethod方法通过反射调用 setter 方法进行注入。
5.2 Setter 注入的优点
  • Setter 注入通常比构造器注入更灵活,适用于可选的依赖项,因为它允许在 Bean 初始化之后再设置依赖。

6. 字段注入

字段注入是最简洁的一种依赖注入方式,它直接通过反射注入字段依赖。Spring 会自动扫描带有@Autowired注解的字段,并注入对应的依赖。

6.1 字段注入实现

字段注入通过AutowiredAnnotationBeanPostProcessor实现,它会扫描所有带有@Autowired注解的字段,并使用反射将依赖注入到字段中。

关键源码
  • postProcessBeforeInitialization方法中,通过反射机制注入字段依赖。
6.2 字段注入的优点与缺点
  • 字段注入虽然简洁,但它没有强制依赖检查,也没有方法来管理初始化顺序。因此,它一般不推荐用于依赖较多的场景,但对于简单的 Bean 和短小的依赖链来说非常有效。

7. 依赖注入的自动装配方式

Spring 支持多种自动装配方式:

  • 按类型自动装配
  • 按名称自动装配
  • 构造器自动装配

每种方式的实现逻辑有所不同,Spring 根据这些装配规则来注入 Bean。

7.1 按类型自动装配

按类型自动装配是最常见的一种方式,Spring 会根据属性的类型查找符合要求的 Bean,并进行注入。

关键源码
  • autowireByType方法中,Spring 根据属性的类型查找并注入 Bean。
7.2 按名称自动装配

按名称自动装配的方式会先根据字段名称查找对应的 Bean,然后进行注入。

关键源码
  • autowireByName方法中,Spring 根据字段名称查找并注入相应的 Bean。

8. 依赖注入的生命周期管理

Spring 对依赖注入的管理不仅限于 Bean 的初始化,还包括了 Bean 的生命周期管理。Spring 容器可以管理 Bean 的初始化顺序,确保在依赖注入过程中正确处理 Bean 的依赖关系。

8.1 BeanPostProcessor 的角色

BeanPostProcessor是 Spring 提供的一种扩展机制,允许开发者在 Bean 实例化后、初始化前和初始化后进行自定义操作。它可以用于修改 Bean 的依赖注入行为,或者为 Bean 注入额外的功能。

关键源码
  • postProcessBeforeInitializationpostProcessAfterInitialization方法:允许开发者在依赖注入的过程中插入自定义逻辑。

总结

依赖注入(DI)是 Spring 框架的核心特性之一,通过解耦组件之间的依赖关系,提升了代码的可维护性和可测试性。Spring 提供了多种依赖注入方式,包括构造器注入、Setter 注入和字段注入,每种方式都有其适用场景。此外,Spring 的生命周期管理机制和BeanPostProcessor接口为开发者提供了强大的扩展能力,能够灵活地控制 Bean 的初始化和依赖注入过程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 20:43:17

常见问题及参考链接

1、ubuntu 搜狗输入法安装 和 无法输入中文 https://blog.csdn.net/ytusdc/article/details/132378645 2、Ubuntu 20.04 中 Git 的安装、配置和基本操作指南 https://blog.csdn.net/m0_73359068/article/details/146930790 3、

作者头像 李华
网站建设 2026/5/28 16:22:48

搞定 Nginx 生产部署:避坑指南 + 最佳实践

先灵魂拷问一下:写了一堆接口却不会部署?服务器被恶意请求打崩过?静态资源加载慢到用户想摔手机?别慌!Nginx 作为后端工程师的「部署瑞士军刀」,能搞定反向代理、负载均衡、限流防刷等一堆骚操作。记住咯&a…

作者头像 李华
网站建设 2026/5/28 14:52:44

基于LangChain手工测试用例生成工具

在编写测试用例的过程中,测试工程师会通过需求文档,研发的概要设计等信息编写测试用例,测试用例的输出格式常常为思维导图或者excel等数据信息。 在以上的流程中,一个测试工程师可以根据比较详细的需求文档以及研发的概要设计输出…

作者头像 李华
网站建设 2026/5/23 12:46:16

接口性能优化的11个小技巧

接口性能优化 对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。 该问题说简单也简单,说复杂也复杂。 有时候,只需加个索引就能解决问题。 有时候,需要做代码重构。 有时候&am…

作者头像 李华
网站建设 2026/5/28 16:35:18

git个人开发流程

1. 标准开发流程 (针对个人项目) 第一步:同步主分支 (保持起点最新) # 1. 切换回主分支 git checkout main# 2. 拉取远程最新代码 (防止你在这个设备开发时,在另一个设备Push过代码) git pull origin main 第二步:新建并切换分支 不要在 …

作者头像 李华