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

【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&#xff0c;离不开的一个东西就是spring&#xff1b;当我想了解什么是spring的时候&#xff0c;一查&#xff0c;基本上都是围绕着两个词来展开的&#xff1a;IoC和AOP。 对于我自己来说&#xff0c;AOP我觉得比较好理解&#xff0c;因为不管是之前写golang还是pyt…...

【开源免费】基于SpringBoot+Vue.JS校园社团信息管理系统(JAVA毕业设计)

本文项目编号 T 107 &#xff0c;文末自助获取源码 \color{red}{T107&#xff0c;文末自助获取源码} T107&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

设计模式 创建型 工厂模式(Factory Pattern)与 常见技术框架应用 解析

工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种封装对象创建过程的方式&#xff0c;使得对象的创建与使用分离&#xff0c;从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与…...

pip 下载安装时使用国内源配置

pip 是 Python 的包管理工具&#xff0c;用于安装和管理第三方库。然而&#xff0c;在某些情况下&#xff0c;默认的 PyPI&#xff08;Python Package Index&#xff09;源可能由于网络原因导致下载速度慢或者连接不稳定。幸运的是&#xff0c;我们可以轻松地配置 pip 使用国内…...

【数据结构】数据结构简要介绍

数据结构是计算机科学中用于组织、管理和存储数据的方式&#xff0c;以便于高效地访问和修改数据。 数据结构的分类&#xff1a; 数据结构可以大致分为两类&#xff1a;线性结构和非线性结构。 1. 线性结构 线性结构中的数据按顺序排列&#xff0c;每个元素有唯一的前驱和后…...

数据分析-Excel

数据类型和函数初步 Excel中有文本类型和数值类型–但是无法用肉眼分辨出来isnumber来区分是否是数值类型text和value函数可以完成数值类型以及文本类型的转换单元格第一位输入’方式明确输入的是文本sum函数必须是数值类型 文本连接-and-or-not-if-mod-max函数 字符串的连接…...

Yocto项目—机器配置文件详解

引言 在Yocto项目中&#xff0c;机器配置文件&#xff08;Machine Configuration File&#xff09;是系统定制化的重要组成部分&#xff0c;直接决定了构建的目标平台硬件特性和能力。本文将深入探讨Yocto项目中的机器配置文件&#xff0c;从其作用、结构到具体配置方法&#…...

30天开发操作系统 第 10 天 -- 叠加处理

前言 得益于昨天的努力&#xff0c;我们终于可以进行内存管理了。不过仔细一看会注意到&#xff0c;bootpack.c都已经有254行了。笔者感觉这段程序太长了&#xff0c;决定整理一下&#xff0c;分出一部分到memory.c中去。(整理中)…好了&#xff0c;整理完了。现在bootpack.c变…...

第十讲 比特币的社会与文化影响

比特币作为一种革命性的数字货币&#xff0c;不仅在经济领域产生了深远的影响&#xff0c;也在社会和文化层面引发了广泛的讨论和变革。本文将探讨比特币如何塑造我们的社会观念、文化趋势以及对未来的展望。 一、比特币与社会观念的变迁 比特币的出现挑战了传统的货币观念和…...

Unity2D无限地图的实现(简单好抄)

说明&#xff1a;本教程实现的是在2D游戏中玩家在游戏中上下左右移动的时候自动进行地图拼接的功能&#xff0c;如果你只想实现左右移动的无限地图&#xff0c;那么这篇博客也能起到一定参考作用。 思路 第一步&#xff1a; 创建一个10*10的2D游戏对象当做地图 第二步创建一个…...

TCP网络编程(一)—— 服务器端模式和客户端模式

这篇文章将会编写基本的服务器网络程序&#xff0c;主要讲解服务器端和客户端代码的原理&#xff0c;至于网络名词很具体的概念&#xff0c;例如什么是TCP协议&#xff0c;不会过多涉及。 首先介绍一下TCP网络编程的两种模式&#xff1a;服务器端和客户端模式&#xff1a; 首先…...

03-类和对象(上)

一、类的概述 1.类的引入 类的封装&#xff1a;将数据和方法封装在一起&#xff0c;加以权限区分&#xff0c;用户只能通过公共方法访问私有数据。 为什么要将数据和方法封装在一起呢&#xff0c;而且还要通过公共方法才能访问私有数据&#xff1f; C语言中数据和方法分开可…...

PCL点云库入门——PCL库点云滤波算法之统计滤波(StatisticalOutlierRemoval)

1、算法原理 统计滤波算法是一种利用统计学原理对点云数据进行处理的方法。它主要通过计算点云中每个点的统计特性&#xff0c;如均值、方差等&#xff0c;来决定是否保留该点。算法首先会设定一个统计阈值&#xff0c;然后对点云中的每个点进行分析。如果一个点的统计特性与周…...

【机器学习】Kaggle实战信用卡反欺诈预测(场景解析、数据预处理、特征工程、模型训练、模型评估与优化)

构建信用卡反欺诈预测模型 建模思路 本项目需解决的问题 本项目通过利用信用卡的历史交易数据&#xff0c;进行机器学习&#xff0c;构建信用卡反欺诈预测模型&#xff0c;提前发现客户信用卡被盗刷的事件。 项目背景 数据集包含由欧洲持卡人于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&#xff08;控制状态寄存器&#xff09;与 GPR 的…...

Object.defineProperty() 完整指南

Object.defineProperty() 完整指南 1. 基本概念 Object.defineProperty() 方法允许精确地添加或修改对象的属性。默认情况下&#xff0c;使用此方法添加的属性是不可修改的。 1.1 基本语法 Object.defineProperty(obj, prop, descriptor)参数说明&#xff1a; obj: 要定义…...

postgresql函数创建

postgresql的函数创建 1.创建函数的基本语法&#xff1a; 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电平偏高问题分析

参考&#xff1a;https://zhuanlan.zhihu.com/p/689336144 有时候看到CAN总线H和L的差值波形的最后一位电平会变高很多&#xff0c;这是什么原因呢&#xff1f; 实际上这是正常的现象&#xff0c;最后一位是ACK位。问题描述为&#xff1a;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…...

【独家逆向工程实录】:从Perplexity官网前端JS中提取未开放股票接口,附Python动态Token生成脚本

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity股票信息检索 Perplexity AI 公司尚未上市&#xff0c;因此在主流证券交易所&#xff08;如NYSE、NASDAQ&#xff09;中并无对应的股票代码或实时行情数据。这一事实对开发者和金融数据集成场景具有…...

国自然最后冲刺:如何用ChatGPT把自查做到“零漏项”?

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 2026年是国自然改版元年,模板大变,旧套路失效,新坑又挖了不少。今天七…...

记一次 mac openClaw gateway 启动未正常关闭导致的问题

openclaw 目前是一个比较火的 AI 工具&#xff0c;因为其高权限带来了一系列的风险和安全隐患按照官方步骤删除后&#xff0c;因open claw 的 gateway 没有正常关闭&#xff0c;导致端口一直在后台运行如果您也遇到类似的问题&#xff0c;可在 mac 终端执行如下命令进行关闭1.先…...

别再只会写脚本了!用MATLAB面向对象编程重构你的数据处理流程(附完整Point2D类示例)

从脚本到对象&#xff1a;MATLAB面向对象编程的工程化实践 在科研与工程计算领域&#xff0c;MATLAB长期占据着不可替代的地位。然而&#xff0c;许多用户在使用多年后&#xff0c;依然停留在编写线性脚本的阶段&#xff0c;导致代码库逐渐演变成难以维护的"意大利面条式代…...

LibSVM在Matlab里的实战:从分类到回归,手把手调参与结果解读

LibSVM在Matlab里的实战&#xff1a;从分类到回归&#xff0c;手把手调参与结果解读 当你第一次在Matlab中成功运行LibSVM时&#xff0c;看到命令行窗口跳出"Accuracy 86.6667%"的那一刻&#xff0c;可能既兴奋又困惑。兴奋的是工具终于跑通了&#xff0c;困惑的是那…...

3大核心功能构建学术研究知识库:Obsidian科研模板实战指南

3大核心功能构建学术研究知识库&#xff1a;Obsidian科研模板实战指南 【免费下载链接】obsidian_vault_template_for_researcher This is an vault template for researchers using obsidian. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian_vault_template_for_res…...

Hyper-V虚拟机文件迁移避坑指南:从C盘挪走Ubuntu,释放系统盘空间

Hyper-V虚拟机文件迁移实战&#xff1a;安全释放C盘空间的完整方案 当你在Windows系统上使用Hyper-V运行Ubuntu虚拟机时&#xff0c;是否注意到C盘空间正在被悄悄吞噬&#xff1f;许多技术爱好者初次接触Hyper-V时&#xff0c;往往直接采用默认设置&#xff0c;将所有虚拟机文件…...

基于CW32F030的BLDC电机控制:从国产MCU到完整评估方案

1. 项目概述&#xff1a;从一颗国产MCU到一套完整的BLDC评估方案最近在做一个直流无刷电机&#xff08;BLDC&#xff09;的小项目&#xff0c;选型时发现了一款挺有意思的国产MCU——武汉芯源的CW32F030C8T6&#xff0c;以及围绕它打造的一套完整的评估套件CW32_BLCD_EVA。对于…...

从USB转TTL到RS485:手把手教你用一颗CH342F芯片玩转三种串口通信

CH342F芯片实战指南&#xff1a;一芯三用的串口通信解决方案 在物联网和工业控制领域&#xff0c;串口通信依然是设备间可靠数据传输的基石。面对多样化的接口标准&#xff08;TTL、RS232、RS485&#xff09;&#xff0c;工程师常常需要准备多种转换模块。而CH342F芯片以其独特…...

unrpa:当Ren‘Py游戏资源被锁定时,你的万能钥匙是什么?

unrpa&#xff1a;当RenPy游戏资源被锁定时&#xff0c;你的万能钥匙是什么&#xff1f; 【免费下载链接】unrpa A program to extract files from the RPA archive format. 项目地址: https://gitcode.com/gh_mirrors/un/unrpa 你是否曾面对一个RenPy游戏的RPA档案文件…...