【gopher的java学习笔记】什么是Spring - IoC和DI
一聊到java,离不开的一个东西就是spring;当我想了解什么是spring的时候,一查,基本上都是围绕着两个词来展开的:IoC和AOP。
对于我自己来说,AOP我觉得比较好理解,因为不管是之前写golang还是python,都或多或少的接触过。但是IoC就相对要晦涩一点了,网上找到的材料又大多只是概念性的照本宣科,所以经过一系列的学习后,自己也有了一些理解,在这里记录一下希望能帮到大家。
什么是IoC
控制反转(Inversion of Control)是软件工程领域中的一项设计原则,它将程序中对象之间的依赖关系的控制权从代码本身转移到外部容器或框架中。这一理念在面向对象编程的实践中尤为常见。
在传统编程模式中,对象的创建、配置和管理由开发者在代码中显式完成。开发者需要手动编写代码来创建对象实例,并管理它们的生命周期和依赖关系。例如,在Java中,开发者使用new关键字来创建对象实例,并手动设置对象的属性和依赖关系。
但在IOC模式下,对象的创建、配置和管理由专门的容器或框架负责。开发者只需定义好对象及其依赖关系,容器会自动创建并管理这些对象。例如,在Spring框架中,开发者通过XML配置文件、Java注解或Java配置类来声明Bean(对象),Spring容器会根据这些声明来创建Bean实例,并管理它们的生命周期和依赖关系。
这种架构带来了诸多优势,最明显的我认为就是由于依赖关系由容器管理,组件之间的耦合度大大降低。组件只需声明其依赖关系,而无需关心依赖对象的创建和管理,从而提高了系统的灵活性和可维护性。
实现IoC的机制多种多样,如策略设计模式、服务定位器模式、工厂模式以及依赖注入(DI)等。
所以,我们平时听到比较多的DI,其实就是IoC的一种实现方式。
接下来,我们再了解一下依赖注入这种实现IoC的方法。
什么是依赖注入(DI)
依赖注入是一种我们可以用来实现控制反转(IoC)的模式,其中被反转的控制是设置对象的依赖关系。
将对象与其他对象连接起来,或者将对象“注入”到其他对象中,这一操作是由装配器完成的,而不是由对象本身完成。
以下是在传统编程中创建对象依赖关系的方式:
public class Store {private Item item;public Store() {item = new ItemImpl1(); }
}
在上面的示例中,我们需要在 Store 类本身中实例化 Item 接口的一个实例。
通过使用依赖注入,我们可以重写这个示例,而无需指定我们想要的 Item 的实例化过程。
public class Store {private Item item;public Store(Item item) {this.item = item;}
}
这样做的一个显著的好处,就是我们的Store的业务代码无需关注Item的构造过程,以后如果哪天Item的构造的方式变了,比如构造函数从2个变成了3个,如果是传统的变成模式,那么我们就需要修改自己的代码去做适配;但是如果是DI的话,我们便不需要关心这部分的变化。
什么是IoC Container
核心概念
IOC容器是一种设计模式,其核心思想是控制反转(Inversion of Control)。在传统的应用程序中,对象之间的依赖关系通常是硬编码的,即一个对象直接创建和使用另一个对象。而IOC容器通过将对象的创建和管理交给容器来反转这种控制,从而实现松耦合和更好的可测试性。
实现步骤
容器初始化
在创建和使用IOC容器之前,首先需要初始化容器。这通常涉及创建一个容器实例,并配置容器的一些基本属性。
对象注册
将需要管理的对象注册到容器中。这通常涉及将对象的名称(或标识)与对象实例或对象创建工厂进行关联。在Spring框架中,可以通过XML配置文件、注解或Java配置类来完成对象的注册。
依赖关系解析
当容器接收到一个对象请求时,它需要解析该对象的依赖关系。这通常涉及查找对象所需的依赖项,并确保这些依赖项已被注册到容器中。
对象实例化
一旦依赖关系被解析,容器就可以创建并返回请求的对象实例。这通常涉及调用对象的构造函数或工厂方法,并将解析得到的依赖项注入到对象中。
具体实现方式
基于XML的配置方式
在Spring框架中,可以通过XML配置文件来定义Bean(即对象)和它们的依赖关系。容器在启动时会读取配置文件,并解析出Bean的定义和依赖关系。然后,当容器接收到一个对象请求时,它会根据配置文件中的信息来创建和返回对象实例。
示例:
<beans><bean id="serviceA" class="com.example.ServiceA"/><bean id="serviceB" class="com.example.ServiceB"><property name="serviceA" ref="serviceA"/></bean>
</beans>
在上述配置中,serviceA和serviceB是两个Bean,serviceB依赖于serviceA。容器在创建serviceB实例时,会自动将serviceA实例注入到serviceB中。
基于注解的配置方式
除了XML配置文件外,Spring框架还支持通过注解来定义Bean和它们的依赖关系。这通常涉及在类上使用特定的注解来标记它们作为Bean,并在字段或方法上使用注解来定义依赖关系。
示例:
@Component
public class ServiceA {// 类定义
}@Component
public class ServiceB {@Autowiredprivate ServiceA serviceA;// 类定义
}
在上述示例中,@Component注解用于标记ServiceA和ServiceB作为Bean。@Autowired注解用于自动注入ServiceA实例到ServiceB中。
基于Java配置类的配置方式
Spring框架还支持通过Java配置类来定义Bean和它们的依赖关系。这通常涉及创建一个配置类,并使用@Configuration注解和@Bean注解来定义Bean。
示例:
@Configuration
public class AppConfig {@Beanpublic ServiceA serviceA() {return new ServiceA();}@Beanpublic ServiceB serviceB() {ServiceB serviceB = new ServiceB();serviceB.setServiceA(serviceA());return serviceB;}
}
在上述示例中,AppConfig是一个配置类,使用@Configuration注解进行标记。@Bean注解用于定义Bean,serviceB依赖于serviceA,通过调用serviceA()方法来获取serviceA实例并注入到serviceB中。
容器的高级特性
除了基本的对象注册和依赖注入功能外,IOC容器还支持一些高级特性,如生命周期管理、AOP(面向切面编程)支持、事件发布等。这些特性使得IOC容器更加灵活和强大,能够满足更复杂的应用程序需求。
相关文章:
【gopher的java学习笔记】什么是Spring - IoC和DI
一聊到java,离不开的一个东西就是spring;当我想了解什么是spring的时候,一查,基本上都是围绕着两个词来展开的:IoC和AOP。 对于我自己来说,AOP我觉得比较好理解,因为不管是之前写golang还是pyt…...
【开源免费】基于SpringBoot+Vue.JS校园社团信息管理系统(JAVA毕业设计)
本文项目编号 T 107 ,文末自助获取源码 \color{red}{T107,文末自助获取源码} T107,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
设计模式 创建型 工厂模式(Factory Pattern)与 常见技术框架应用 解析
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种封装对象创建过程的方式,使得对象的创建与使用分离,从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与…...
pip 下载安装时使用国内源配置
pip 是 Python 的包管理工具,用于安装和管理第三方库。然而,在某些情况下,默认的 PyPI(Python Package Index)源可能由于网络原因导致下载速度慢或者连接不稳定。幸运的是,我们可以轻松地配置 pip 使用国内…...
【数据结构】数据结构简要介绍
数据结构是计算机科学中用于组织、管理和存储数据的方式,以便于高效地访问和修改数据。 数据结构的分类: 数据结构可以大致分为两类:线性结构和非线性结构。 1. 线性结构 线性结构中的数据按顺序排列,每个元素有唯一的前驱和后…...
数据分析-Excel
数据类型和函数初步 Excel中有文本类型和数值类型–但是无法用肉眼分辨出来isnumber来区分是否是数值类型text和value函数可以完成数值类型以及文本类型的转换单元格第一位输入’方式明确输入的是文本sum函数必须是数值类型 文本连接-and-or-not-if-mod-max函数 字符串的连接…...
Yocto项目—机器配置文件详解
引言 在Yocto项目中,机器配置文件(Machine Configuration File)是系统定制化的重要组成部分,直接决定了构建的目标平台硬件特性和能力。本文将深入探讨Yocto项目中的机器配置文件,从其作用、结构到具体配置方法&#…...
30天开发操作系统 第 10 天 -- 叠加处理
前言 得益于昨天的努力,我们终于可以进行内存管理了。不过仔细一看会注意到,bootpack.c都已经有254行了。笔者感觉这段程序太长了,决定整理一下,分出一部分到memory.c中去。(整理中)…好了,整理完了。现在bootpack.c变…...
第十讲 比特币的社会与文化影响
比特币作为一种革命性的数字货币,不仅在经济领域产生了深远的影响,也在社会和文化层面引发了广泛的讨论和变革。本文将探讨比特币如何塑造我们的社会观念、文化趋势以及对未来的展望。 一、比特币与社会观念的变迁 比特币的出现挑战了传统的货币观念和…...
Unity2D无限地图的实现(简单好抄)
说明:本教程实现的是在2D游戏中玩家在游戏中上下左右移动的时候自动进行地图拼接的功能,如果你只想实现左右移动的无限地图,那么这篇博客也能起到一定参考作用。 思路 第一步: 创建一个10*10的2D游戏对象当做地图 第二步创建一个…...
TCP网络编程(一)—— 服务器端模式和客户端模式
这篇文章将会编写基本的服务器网络程序,主要讲解服务器端和客户端代码的原理,至于网络名词很具体的概念,例如什么是TCP协议,不会过多涉及。 首先介绍一下TCP网络编程的两种模式:服务器端和客户端模式: 首先…...
03-类和对象(上)
一、类的概述 1.类的引入 类的封装:将数据和方法封装在一起,加以权限区分,用户只能通过公共方法访问私有数据。 为什么要将数据和方法封装在一起呢,而且还要通过公共方法才能访问私有数据? C语言中数据和方法分开可…...
PCL点云库入门——PCL库点云滤波算法之统计滤波(StatisticalOutlierRemoval)
1、算法原理 统计滤波算法是一种利用统计学原理对点云数据进行处理的方法。它主要通过计算点云中每个点的统计特性,如均值、方差等,来决定是否保留该点。算法首先会设定一个统计阈值,然后对点云中的每个点进行分析。如果一个点的统计特性与周…...
【机器学习】Kaggle实战信用卡反欺诈预测(场景解析、数据预处理、特征工程、模型训练、模型评估与优化)
构建信用卡反欺诈预测模型 建模思路 本项目需解决的问题 本项目通过利用信用卡的历史交易数据,进行机器学习,构建信用卡反欺诈预测模型,提前发现客户信用卡被盗刷的事件。 项目背景 数据集包含由欧洲持卡人于2013年9月使用信用卡进行交的…...
【RISC-V CPU debug 专栏 4 -- RV CSR寄存器介绍】
文章目录 Overview1. CSR寄存器访问指令2. 为何CSR地址不是4字节对齐(1) CSR寄存器空间是独立的地址空间(2) 节省编码空间(3) 对硬件实现的简化 3. CSR的物理大小和对齐无关4. RISC-V 中的 GPR 寄存器及其作用GPR 的详细用途CSR(控制状态寄存器)与 GPR 的…...
Object.defineProperty() 完整指南
Object.defineProperty() 完整指南 1. 基本概念 Object.defineProperty() 方法允许精确地添加或修改对象的属性。默认情况下,使用此方法添加的属性是不可修改的。 1.1 基本语法 Object.defineProperty(obj, prop, descriptor)参数说明: obj: 要定义…...
postgresql函数创建
postgresql的函数创建 1.创建函数的基本语法: CREATE [OR REPLACE] FUNCTION function_name(parameter_list) RETURNS return_type AS $$ BEGIN -- 函数体 END; $$ LANGUAGE language_name;2.创建函数时传入参数示例:add_user tbl_user表 | id | username | …...
ECMAScript 变量
文章目录 前言一、ECMAScript 变量二、var 关键字1、var 声明作用域2、var 声明提升(hoist)三、let 关键字四、const 关键字🔰 总结前言 任何语言的核心所描述的都是这门语言在最基本的层面上如何工作,涉及 语法、操作符、数据类型以及内置功能,在此基础之上才可以构建复…...
CAN总线波形中最后一位电平偏高或ACK电平偏高问题分析
参考:https://zhuanlan.zhihu.com/p/689336144 有时候看到CAN总线H和L的差值波形的最后一位电平会变高很多,这是什么原因呢? 实际上这是正常的现象,最后一位是ACK位。问题描述为:CAN总线ACK电平偏高。 下面分析下原因…...
【C++】22___STL常用算法
目录 一、常用遍历算法 二、常用查找算法 2.1 find 2.2 其它查找算法 三、常用排序算法 3.1 sort 3.2 其它排序算法 四、拷贝 & 替换 4.1 copy 4.2 其它算法 五、常用的算数生成算法 5.1 accumulate 5.2 fill 六、常用集合算法 6.1 set_intersection 6…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
