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

Spring 依赖 详解

Spring 依赖详解

在 Spring 框架中,依赖 是指一个对象(Bean)需要另一个对象(Bean)来完成其功能的情况。Spring 通过 依赖注入(Dependency Injection, DI)控制反转(Inversion of Control, IoC) 来实现对依赖的管理。


1. 什么是依赖?

1.1 概念
  • 依赖 是指一个类需要另一个类的协助才能完成其工作。
  • 例如,OrderService 可能依赖于 OrderRepository 来访问数据库。
1.2 传统方式的问题
  • 在传统开发中,依赖通过手动创建实例(new)来实现。
  • 问题:
    • 强耦合:代码依赖具体实现,难以扩展和替换。
    • 难以测试:无法轻松替换依赖的 Mock 对象。
    • 复杂管理:在大型项目中,依赖关系复杂且难以维护。

2. Spring 依赖的管理

Spring 使用 IoC 容器来管理依赖,通过 依赖注入 将依赖关系注入到对象中,解决传统方式的问题。

2.1 依赖注入(DI)的核心思想
  • 对象本身不负责管理其依赖的创建,而是由外部容器注入。
  • 依赖关系在配置文件(XML、JavaConfig)或注解中声明。

3. 依赖注入的方式

Spring 提供三种主要的依赖注入方式:

3.1 构造器注入
  • 概念:通过构造方法注入依赖。
  • 优点
    • 强制依赖注入,避免遗漏。
    • 有助于实现不可变对象。
  • 示例
    @Component
    public class OrderService {private final OrderRepository orderRepository;@Autowiredpublic OrderService(OrderRepository orderRepository) {this.orderRepository = orderRepository;}
    }
    
3.2 Setter 方法注入
  • 概念:通过 Setter 方法注入依赖。
  • 优点
    • 灵活性高,可以在运行时动态替换依赖。
    • 适用于可选依赖。
  • 示例
    @Component
    public class OrderService {private OrderRepository orderRepository;@Autowiredpublic void setOrderRepository(OrderRepository orderRepository) {this.orderRepository = orderRepository;}
    }
    
3.3 字段注入
  • 概念:直接在字段上注入依赖。
  • 优点
    • 代码简洁,省略了 Getter 和 Setter。
  • 缺点
    • 不支持依赖的不可变性。
    • 不便于单元测试。
  • 示例
    @Component
    public class OrderService {@Autowiredprivate OrderRepository orderRepository;
    }
    

4. 依赖的配置方式

Spring 提供以下几种方式配置依赖关系:

4.1 基于注解的配置(推荐)
  • 使用注解标记类和依赖关系。
  • 主要注解:
    • @Component:声明一个类是 Spring 容器中的 Bean。
    • @Autowired:自动注入依赖。
    • @Qualifier:指定具体的 Bean。
    • @Primary:优先注入特定 Bean。
  • 示例:
    @Component
    public class OrderRepository {}@Component
    public class OrderService {@Autowiredprivate OrderRepository orderRepository;
    }
    
4.2 基于 XML 的配置
  • 在 XML 文件中定义 Bean 和依赖关系。
  • 示例:
    <beans><bean id="orderRepository" class="com.example.OrderRepository"/><bean id="orderService" class="com.example.OrderService"><property name="orderRepository" ref="orderRepository"/></bean>
    </beans>
    
4.3 基于 JavaConfig 的配置
  • 使用 Java 类和注解定义 Bean 和依赖关系。
  • 示例:
    @Configuration
    public class AppConfig {@Beanpublic OrderRepository orderRepository() {return new OrderRepository();}@Beanpublic OrderService orderService(OrderRepository orderRepository) {return new OrderService(orderRepository);}
    }
    

5. 自动装配(Autowired)

5.1 @Autowired 的工作原理
  • Spring 通过类型匹配自动注入依赖。
  • 可以与 @Qualifier@Primary 配合使用,以解决多个候选 Bean 的问题。
5.2 示例
@Component
public class OrderService {@Autowiredprivate OrderRepository orderRepository;
}

6. 多 Bean 配置与冲突解决

当存在多个类型相同的 Bean 时,Spring 提供以下解决方案:

6.1 使用 @Qualifier
  • 明确指定注入的 Bean。
  • 示例:
    @Component("repo1")
    public class OrderRepository {}@Component("repo2")
    public class BackupRepository {}@Component
    public class OrderService {@Autowired@Qualifier("repo1")private OrderRepository orderRepository;
    }
    
6.2 使用 @Primary
  • 设置默认的优先级 Bean。
  • 示例:
    @Component
    @Primary
    public class OrderRepository {}
    

7. 作用域(Scope)

Spring 中 Bean 的默认作用域是 单例(Singleton),还支持其他作用域:

  • Singleton:整个应用中仅有一个实例(默认)。
  • Prototype:每次获取时创建新的实例。
  • Request:每个 HTTP 请求一个实例(Web 应用)。
  • Session:每个 HTTP 会话一个实例(Web 应用)。
  • Application:每个 ServletContext 一个实例(Web 应用)。
示例
@Component
@Scope("prototype")
public class OrderService {}

8. 循环依赖

8.1 什么是循环依赖?
  • 两个或多个 Bean 互相依赖,形成循环。
  • 示例:
    @Component
    public class A {@Autowiredprivate B b;
    }@Component
    public class B {@Autowiredprivate A a;
    }
    
8.2 Spring 的解决方式
  • 单例模式
    • Spring 使用三级缓存解决循环依赖:
      • 一级缓存:完整实例(单例池)。
      • 二级缓存:半成品实例。
      • 三级缓存:对象工厂,用于创建代理对象。
  • 原型模式
    • 不支持循环依赖,抛出异常。
8.3 避免循环依赖的建议
  1. 重构代码,避免互相注入。
  2. 使用 @Lazy 注解延迟加载。
  3. 使用构造器注入时确保无循环依赖。

9. 依赖的生命周期

Spring Bean 的生命周期由容器管理,主要包括以下阶段:

  1. 实例化:通过反射创建对象。
  2. 依赖注入:注入依赖对象。
  3. 初始化:执行初始化方法。
  4. 使用:Bean 被调用。
  5. 销毁:容器关闭时调用销毁方法。
示例
@Component
public class OrderService {@PostConstructpublic void init() {System.out.println("Initializing OrderService");}@PreDestroypublic void destroy() {System.out.println("Destroying OrderService");}
}

10. Spring 依赖的优缺点

10.1 优点
  1. 降低耦合:Bean 的创建和管理由容器负责,模块更加独立。
  2. 便于测试:可以轻松替换依赖为 Mock 对象。
  3. 增强灵活性:可以动态配置和替换 Bean。
  4. 代码简洁:减少手动管理依赖的代码。
10.2 缺点
  1. 学习曲线:需要理解 IoC 和 DI 的概念及实现。
  2. 配置复杂性:在大型项目中,Bean 和依赖关系可能变得复杂。
  3. 性能开销:动态代理和反射可能会影响性能。

11. 总结

Spring 的依赖管理通过 IoC 容器和依赖注入,大幅提升了代码的灵活性、可读性和可维护性。通过多种注入方式(构造器、Setter、字段),以及配置方式(注解、XML、JavaConfig),Spring 适应了
各种开发场景。深入理解 Spring 依赖的机制和原理,有助于开发者设计更优雅、解耦的系统架构。

相关文章:

Spring 依赖 详解

Spring 依赖详解 在 Spring 框架中&#xff0c;依赖 是指一个对象&#xff08;Bean&#xff09;需要另一个对象&#xff08;Bean&#xff09;来完成其功能的情况。Spring 通过 依赖注入&#xff08;Dependency Injection, DI&#xff09; 和 控制反转&#xff08;Inversion of…...

千益畅行,旅游卡有些什么优势?

千益畅行共享旅游卡是一种创新的旅游服务模式&#xff0c;旨在通过整合各类旅游资源&#xff0c;为用户提供一站式的旅游解决方案。这张旅游卡支持2至6人同行&#xff0c;涵盖了接机、酒店、用餐、大巴、导游、景区门票等服务&#xff0c;用户只需自行承担往返交通费用即可享受…...

Ubuntu24 cgroupv2导致rancher(k3s)启动失败的处理

方案一&#xff1a; 修改系统镜像为ubuntu18 方案二&#xff1a; 修改当前系统的cgroup版本&#xff0c;由v2改成v1 修改步骤&#xff1a; 1、查看当前cgroup版本 stat -fc %T /sys/fs/cgroup cgroup v2&#xff0c;输出结果为cgroup2fs cgroup v1&#xff0c;输出为tm…...

学习CSS第二天

学习文章目录 一.内部样式 一.内部样式 写在 html 页面内部&#xff0c;将所有的 CSS 代码提取出来&#xff0c;单独放在 <style> 标签中 语法&#xff1a; <style> h1 { color: red; font-size: 40px; } </style>注意点&#xff1a; <style> 标签理…...

2021数学分析【南昌大学】

2021 数学分析 求极限 lim ⁡ n → ∞ 1 n ( n + 1 ) ( n + 2 ) ⋯ ( n + n ) n \lim_{n \to \infty} \frac{1}{n} \sqrt [n]{(n+1)(n+2) \cdots (n+n)} n→∞lim​n1​n(n+1)(n+2)⋯(n+n) ​ lim ⁡ n → ∞ 1 n ( n + 1 ) ( n + 2 ) ⋯ ( n + n ) n = lim ⁡ n → ∞ ( n + …...

单端和差分信号的接线法

内容来源&#xff1a;【单端信号 差分信号与数据采集卡的【RSE】【 NRES】【 DIFF】 模式的连接】 此篇文章仅作笔记分享。 单端输入 单端信号指的是输入信号由一个参考端和一个信号端构成&#xff0c;参考端一般是地端&#xff0c;信号就是通过计算信号端口和地端的差值所得…...

力扣-图论-2【算法学习day.52】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

MySQL如何区分幻读和不可重复读

在MySQL中&#xff0c;幻读和不可重复读都是并发事务中可能出现的问题&#xff0c;但它们的表现和原因略有不同。 不可重复读 (Non-Repeatable Read) 不可重复读是指在同一个事务内&#xff0c;多次读取同一行数据时&#xff0c;可能会得到不同的结果。这种情况发生在一个事务…...

界面控件Syncfusion Essential Studio®现在已完全支持 .NET 9

Syncfusion Essential Studio现在完全支持 .NET 9&#xff0c;可最新版本2024 Volume 3 版本中使用&#xff01;通过此更新&#xff0c;Blazor、.NET MAUI、WPF、WinForms、WinUI和ASP.NET Core 平台中的 Syncfusion 组件以及文档处理库已准备好让您利用 .NET 9 中的最新功能。…...

openEuler安装lsb_release

lsb_release是linux下查看发行版信息用的工具 lsb_release只是一个小程序&#xff0c;它的包名并不是lsb_release lsb_release其实是红帽的一个项目&#xff0c;其名为redhat-lsb 我们的lsb_release就是其中的一部分&#xff0c;更准确的说是redhat-lsb-core 从网站&#xff1…...

统计数字字符个数

统计数字字符个数 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入一行字符&#xff0c;统计出其中数字字符的个数。 输入 一行字符串&#xff0c;总长度不超过255。 输出 出为1行&#xff0c;输出…...

44页PDF | 信息化战略规划标准框架方法论与实施方法(限免下载)

一、前言 这份报告详细介绍了企业信息化战略规划的标准框架、方法论以及实施方法&#xff0c;强调了信息化规划应以业务战略和IT战略为驱动力&#xff0c;通过构筑企业架构&#xff08;EA&#xff09;来连接长期战略和信息化建设。报告提出了信息化规划原则&#xff0c;探讨了…...

计算机网络期末复习-part1-概述

1、互联网的组成 互联网由两大块组成。 1、边沿部分&#xff1a;由所有连接在互联网上的主机组成&#xff0c;是用户直接使用的部分。 2、核心部分&#xff0c;由大量网络和路由器组成&#xff0c;为边缘部分提供服务。 2、数据传送阶段的三种交换方式的主要特点 1、电路交…...

A1228 php+Mysql旅游供需平台的设计与实现 导游接单 旅游订单 旅游分享网站 thinkphp框架 源码 配置 文档 全套资料

旅游供需平台 1.项目描述2. 开发背景与意义3.项目功能4.界面展示5.源码获取 1.项目描述 随着社会经济的快速发展&#xff0c;生活水平的提高&#xff0c;人们对旅游的需求日益增强&#xff0c;因此&#xff0c;为给用户提供一个便利的查看导游信息&#xff0c;进行导游招募的平…...

RabbitMQ消息可靠性保证机制5--消息幂等性处理

RabbitMQ层面有实现“去重机制”来保证“恰好一次”吗&#xff1f;答案是没并没有&#xff0c;而且现在主流的消息中间件都没有实现。 一般解决重复消息的办法是&#xff1a;在消费端让我们消费消息操作具有幂等性。 幂等性问题并不是消息系统独有&#xff0c;而是&#xff0…...

Claude3.5如何使用?

Claude 3.5 Sonnet&#xff0c;性能直接吊打了 GPT-4o&#xff0c;甚至价格还更便宜。网友们纷纷展开实测&#xff0c;有人表示自己一半的工作已经可以由它替代了&#xff01;而最让人惊喜的新功能&#xff0c;莫过于 Artifacts 了。 就在昨天&#xff0c;Anthropic 深夜发布了…...

力扣刷题TOP101:14.BM16 删除有序链表中重复的元素-II

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的 1→1→2→3→3 删除重复后变成2。 思路 这个任务是删除链表里重复的节点包含本身。可以看成是一个抽奖活动的系统升级。某人通过多种方式报名&#xff08;节点不同&#xff09;&#xff0c;后台数据检测到这些…...

解决github网络慢的问题

前言 本文采用替换host的方式来加速github的git请求&#xff0c;主要我自己用来备份的懒人方式&#xff0c;不然每次都要手动修改hosts文件&#xff0c;skrskrskr… 一、获取到可用的ip 先到这个网站查询到低延迟的ip 站长工具&#xff1a;https://ping.chinaz.com/ 第2步&…...

docker及docker exec命令学习笔记

docker exec 是一个常用的 Docker 命令&#xff0c;允许你在已经运行的容器中执行命令或启动新的进程。以下是详细介绍和常见用法&#xff1a; 基本语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]参数详解 1. CONTAINER指定目标容器的名字或容器 ID。可以通过以下命…...

linux环境宝塔服务部署安装及介绍

一、简介 宝塔面板是一款服务器管理软件&#xff0c;支持windows和linux系统&#xff0c;可以通过Web端轻松管理服务器&#xff0c;提升运维效率。例如&#xff1a;创建管理网站、FTP、数据库&#xff0c;拥有可视化文件管理器&#xff0c;可视化软件管理器&#xff0c;可视化C…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...