【初探Spring】——Spring IOC(一)

Spring中的IOC详解 单例Bean和多实例Bean的生命周期主要区别在于实例化和销毁的管理方式,单例Bean在容器启动时创建一个实例,并由容器负责管理其生命周期的完整过程。在Spring框架中,Bean是应用程序的核心组件,它们由Spring容器创建、组装和管理,以帮助开发者实现松耦合、可测试和可维护的代码。IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。Bean的自动装配是Spring框架提供的一种便捷的方式,用于自动解析和设置Bean之间的依赖关系,而无需显式配置每一个依赖关系的方式。 阅读详情

【初探Spring】——Spring IOC(一)

原创  2016年06月13日 09:20:02

IOC:Inversion of Control(控制反转)。IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想。IOC的核心思想就体现在控制、反转这两个词上面,要理解就必须要理解几个问题:

1、谁控制谁?在传统的开发工作中,我们一般都是主动去new一个对象,这个是主动控制依赖对象。但是对于IOC而已,控制权会被移交给容器,所以应该是IOC容器控制对象。

2、控制什么?既然是IOC容器控制对象,那控制什么呢?IOC容器除了负责控制对象的生成还包括外部资源的获取。

3、为何是反转?对象主动生成依赖对象,我们称之为“正转”,但是现在有IOC来负责了,所以反转则是IOC容器来负责对象的生成和注入过程。

4、那些地方反转?依赖对象的获取被反转了。

对于IOC而言,它强调是将主动变为被动,由IOC容器来负责依赖对象的创建和查找,由IOC容器来进行注入组合对象。将原来的强联系、高耦合转变为了弱关系、松耦合。IOC,它能指导我们如何设计出松耦合、更加优良的程序,把应用程序从原来需要维护依赖对象之间关系中彻底解放出来而更加专注于业务逻辑,这样会使得程序的整个体系机构变得非常灵活。

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

有了IOC就有必要提到DI了。DI,Dependency Injection,即“依赖注入”。其实IOC和DI本就是同一个概念的两种不同的表述,DI所描述的是由容器动态地将某个依赖关系注入到主键当中去,其需要理解如下几个概念:

1、谁依赖谁?应用程序依赖IOC容器。

2、依赖什么?因为应用程序不再主动去创建对象,由IOC容器来向应用程序注入,所以应该是应用程序依赖IOC容器来提供的外部资源。

3、谁注入谁?由IOC容器向应用程序注入。

4、注入什么?注入的某个对象所依赖的外部资源。

通俗点将就是IOC就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序;而DI是应用程序依赖容器提供的外部对象,容器将其依赖的外部资源在运行期注入到应用程序中。两者表达的意思都是容器负责应用程序的创建和管理,应用程序只需要在需要它们的时候等待容器将其所依赖的外部资源提供就行,至于来自哪里,怎么来的应用程序都不需要知道。

具体的IOC理解我就不多阐述了,网上实在是太多了,这里推荐几篇博客:

1、谈谈对Spring IOC的理解

2、【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3

3、Spring的IOC原理[通俗解释一下]

4、spring ioc原理(看完后大家可以自己写一个spring)

IOC结构体系

IOC作为一个容器,它里面放得都是bean、bean与bean之间的对应关系,而bean之间的对应关系我们开始都是通过xml配置文件来体现的。那么这里就反馈了如下几个问题:

1、对应与对象之间的关系是通过xml配置文件来描述的(当然也可以是properties等文件)。

2、描述的文件存放位置在那里,一般来说我们都是放在classpath目录下的,但是也可是是URL、fileSystem。

3、文件的解析。

4、Bean在容器中的表现形式,也就是它的数据结构。

对于Spring而言,它用Resource、BeanDefinition、BeanDefinitionReader、BeanFactory、ApplicationContext五个组件来实现以上问题,而同时这5个接口定义了 spring ioc 容器的基本代码组件结构。下面我们逐一了解这五个结构

Resource

Resource,对资源的抽象,它的每一个实现类都代表了一种资源的访问策略,如ClasspathResource 、 URLResource ,FileSystemResource 等。

20151217100002

 

BeanDefinition

用来描述和抽象一个具体的Bean对象,它是描述Bean对象的基本数据结构。

BeanDefinitionReader

外部资源所表达的语义需要统一转化为统一的内部数据结构BeanDefinition,这个时候BeanDefinitionReader就起到统一解析的作用力了。对应不同的描述需要有不同的 Reader 。如 XmlBeanDefinitionReader 用来读取xml 描述配置的 bean 对象。

20151217100001

BeanFactory

BeanFactory是一个非常纯粹的bean容器,它是IOC必备的数据结构,其中BeanDefinition是她的基本结构,它内部维护着一个BeanDefinition map,并可根据BeanDefinition 的描述进行 bean 的创建和管理。

 

20151217100003

 

ApplicationContext

这个就是大名鼎鼎的Spring容器,它叫做应用上下文,与我们应用息息相关,她继承BeanFactory,所以它是BeanFactory的扩展升级版,如果BeanFactory是屌丝的话,那么ApplicationContext则是名副其实的高富帅。由于ApplicationContext的结构就决定了它与BeanFactory的不同,其主要区别有:

1、继承MessageSource,提供国际化的标准访问策略。

2、继承ApplicationEventPublisher,提供强大的事件机制。

3、扩展ResourceLoader,可以用来加载多个Resource,可以灵活访问不同的资源。

4、对Web应用的支持。

下图是上面组合关系图(以ClasspathXmlApplicationContext 为例)

20151217100004

以上图片均来自:啃啃老菜: Spring IOC核心源码学习(一)

 

下面LZ将尽全力阐述IOC的初始化过程和在该过程中涉及的重要组件,这系列博客是也是LZ学习、研究Spring机制和源码的学习笔记,其中难免会参考别人的博客,如有雷同,纯属借鉴。同时也避免不了错误之处,博文中的错误望各位博友指出,不胜感激!!!

参考资料

1、啃啃老菜: Spring IOC核心源码学习(一)

从《新程序员》系列看程序员职业发展趋势与成长路径 在信息技术日新月异的当下,软件开发行业蓬勃发展,程序员作为行业的核心力量,其成长与发展路径备受瞩目。《新程序员》系列杂志应运而生,以其前瞻性的视角、丰富多元的内容,为广大程序员尤其是新程序员提供了洞察行业趋势、学习前沿技术、汲取前辈经验的宝贵窗口。该系列杂志由优快云精心打造,自推出以来,便在开发者群体中引发了强烈反响。《新程序员》系列内容涵盖了从基础技术知识的深入解读,到行业前沿趋势的精准预测;从优秀开发者的成长历程分享,到各大企业数字化转型的实践案例剖析等多个维度。 阅读详情

相关推荐

关于Nuttx操作系统

NuttX是一个成熟的实时操作系统

qq_28576837的博客 4092

【死磕 Spring】----- IOC 之 获取 Document 对象

原文出自:http://cmsblogs.com 在 XmlBeanDefinitionReader.doLoadDocument() 方法中做了两件事情,一是调用 getValidationModeForResource() 获取 XML 的验证模式,二是调用 DocumentLoader.loadDocument() 获取 Document 对象。上篇博客已经分析了获取 XML 验证模式(...

chenssy 的技术博客 2211

Ubuntu22.04+Docker一键部署Autoware Universe避坑指南(附鱼香ROS配置)

本文详细介绍了在Ubuntu22.04系统中使用Docker一键部署Autoware Universe的完整流程,包括鱼香ROS工具链配置、Docker环境优化及VSCode开发环境集成。通过实战指南帮助开发者快速搭建自动驾驶开发环境,解决常见部署问题,提升开发效率。

weixin_29254673的博客 415

Spring IOC源码 个人初探(一) BeanFactory

对Spring 使用BeanFactory生成IOC容器的过程进行一些解析

xiaofanl的博客 258

5G时代必知:LDPC与Polar码实战解析(附MATLAB仿真代码)

本文深入解析5G时代核心信道编码技术LDPC码与Polar码的原理差异及性能表现,通过MATLAB仿真代码展示其在实际通信系统中的应用。LDPC码适用于大数据块高速传输,而Polar码在小数据块低时延场景表现优异,帮助开发者优化5G系统设计。

sugar的博客 642

CARLA 0.9.15从零开始:环境搭建与基础场景实战指南

本文是CARLA 0.9.15从零开始的完整环境搭建与基础运行教程。详细介绍了在Linux系统下配置Python环境、下载安装CARLA核心软件包、启动服务器以及运行第一个基础场景的步骤。重点演示了如何通过Python客户端脚本生成随机车流,并手动控制EGO车辆在仿真城市中行驶,为自动驾驶算法开发构建了坚实的仿真测试基础。

weixin_29053383的博客 777

spring揭秘 读书笔记 一 IoC初探

本文是王福强所著>一书的读书笔记 ioc的基本概念 一个例子 我们看下面这个类,getAndPersistNews方法干了四件事 1 通过newsListener获得所有的新闻id; 2 通过newsListener,用新闻id获得新闻实体 3 用newPersistener存储新闻实体 4 再使用newsListener发布新闻 public class FXNewsProv

程序员小董的专栏 2036

海外跨境电商商城源码-进出口电商平台网站-多语言多商户平台

我们的海外跨境电商系统源码还包括各种功能模块,如用户管理、商品管理、订单管理等。支付管理:与主流支付平台(如Stripe、PayPal等)的集成,支持多种支付方式;订单管理:创建订单、支付订单、取消订单等操作,以及订单状态查询和历史记录;购物车管理:添加商品到购物车、查看购物车、修改购物车中的商品数量等操作;商品管理:商品信息录入、编辑、删除等操作,以及商品分类和搜索功能。客服管理:在线咨询、投诉处理等功能,提供更好的用户服务。用户管理:注册、登录、忘记密码、个人资料。# 检查电子邮件地址是否有效。

柏诣科技的博客 2659

spring源码学习之路---IOC初探(一)

首先把spring源码导入,怎么导入百度下。 首先我们来说一下IOC,IOC是spring最核心的理念,包括AOP也要屈居第二,那么IOC到底是什么呢,四个字,控制反转。网上有不少是这么解释IOC的,说IOC是将对象的创建和依赖关系交给容器,这句话我相信不少人都知道,在我个人的理解,IOC就是让我们的开发变的更简单了。为什么这么说呢,光说没意思,直接上代码。public class Perso

Yxf的博客 738

灰度图像采集显示

灰度图像采集显示 在FPGA内部,采集到的视频数据线通过一个FIFO,将原本与25MHZ时钟同步的数据流转换到FPGA内部50MHZ的时钟。接着将这个数据再送入写DDR3缓存的异步FIFO中,这个FIFO中的数据一旦达到一定数量,就会被写入DDR3中。于此同时,使用另一异步FIFO缓存从DDR3读出的图像数据;LCD驱动模块不断地发出读图像数据请求给到这个FIFO,从中读取图像数据并送给VGA显示器进行实时图像的显示。 ...

小柚子的博客 484

SAP BOM批量反查代码分享

SAP BOM反查批量查询代码分享

我小时候很黑的博客 4972

Spring IOC容器启动流程源码解析(一)——容器概念详解及源码初探

目录 1. 前言 1.1 IOC容器到底是什么 1.2 BeanFactory和ApplicationContext的联系以及区别 1.3 解读IOC容器启动流程的意义 1.4 如何有效的阅读源码 2. 初探IOC容器启动源码 ...

dcnmm48064的专栏 344

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【初探Spring】------Spring IOC(一)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34409741的博客 110

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

专题一: Spring生态初探

切面可以使用注解或 XML 定义。@Aspect@ComponentSpring 框架是企业级 Java 开发的一个多功能且全面的框架。通过理解其核心概念和模块,开发人员可以利用其强大的功能构建健壮、可扩展且易维护的应用程序。

Jeremy程序员 11万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring中IOC详解

一、IOC的原型 IOC ----控制反转 比如我们有一个功能是获取用户数据,我们使用Dao层实现这个功能,再在Service层调用这个功能。但是我们每增加一个接口,比如获取mysql中的数据,就要修改原来的代码,如果再增加一个新的接口,又需要去service实现类中修改对应的实现。 解决方法 用户实际调用的是业务层,dao层他们不需要接触 UserServiceImpl userService = new UserServiceImpl(); userSe

qq_41359998的博客 1万+

【SSM】Spring① IOC

【学习记录】Java后端路线 Spring①,关于控制反转IOC。

m0_64098804的博客 1610

Spring(一)—— Spring IOC

文章目录Spring简介无参构造创建实例对象有参构造创建实例对象 Spring简介 Spring是一个企业级开发框架,为解决企业级项目开发过于复杂而创建的,框架的主要优势之一就是分层架构,允许开发者自主选择组件。 Spring的两大核心机制是IOC(控制反转)和AOP(面向切面编程), 从开发的角度讲,我们使用Spring框架就是用它的IOC和AOP。 IOC是典型的工厂模式,通过工厂去注入对象,...

中都 3381

Spring笔记(一)——Spring IoC详解

Spring IoC详解 包括:三种管理组件的方式(XML、注解、配置类)、各种方式的IoC声明配置、DI依赖注入配置、高级特性等。

qq_40818172的博客 1499

初探Spring之IOC容器

本博客适合已经会用spring的读者,而不是初学者,这里博主也是会用以后再想想为什么能用的一步,想说深入底层,但显然目前还不能叫深入hhh。

Nicer_feng's blog 274

【javaEE】Spring IOC

容器是⽤来容纳某种物品的(基本)装置。(有点废话)我们想想,之前课程我们接触的容器有哪些?• List/Map->数据存储容器• Tomcat->Web容器那么Spring也作为一个容器,装的是对象(Bean)这里的Bean跟在Java基础语法中是不一样的,在Javase中Bean指的是实体类,比如Student类在JavaEE进阶中,Bean指的是Spring管理的对象。

mr_yuanshen的博客 1300

Spring 核心之 IOC 容器学习一

IOC 与 DI IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们所看到的配置文件。DI(Dependency Injection)依赖注入:就是指对象是被动接受依赖类而不是自己主动去找,换句话说就是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它。 1、对象

lssffy的博客 1448

【Spring】一问详解什么是Spring IoC和DI

一问详解什么是spring ioc

Hanson的博客 1146

初探Spring之IOC

初探Spring之IOC IOC理解 IOC控制反转概念 过去我们生成对象的控制权都是掌握在自己的手里,需要对象的时候就自己取new一个出来。这样建立的各个对象之间耦合的十分紧密,对象之间的依赖关系也是特别复杂,对系统的扩展,维护带来了很大的困难。 IOC出现的背景:解决对象之间的耦合度过高的问题 IOC的思想:借助第三方(Spring )(XML)来实现对象之间的解耦即对象之间的调用都由第三方来...

qq_40843639的博客 177
上一篇: 啃啃老菜: Spring IOC核心源码学习(一)
下一篇: 【初探Spring】——Spring IOC(二):初始化过程—简介
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值