Spring 是包含了众多⼯具⽅法的 IoC 容器

那何为容器呢?容器是用来容纳某种东西的装置。比如:List/Map 是数据存储容器,Tomcat 是Web 容器等等。Spring 也是⼀个容器,是⼀个 IoC 容器。

那何为IoC 呢?IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器。那控制反转具体是什么呢?下面代码举例:

构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身(FrameWork Class),⽽⻋身需要依赖底盘(Bottom Class),⽽底盘需要依赖轮胎(Tire Class),最终程序的实现代码如下:

public class NewCarExample { public static void main(String[] args) { Car car = new Car(); car.init(); } /** * 汽⻋对象 */ static class Car { public void init() { // 依赖⻋身 Framework framework = new Framework(); framework.init(); } }/** * ⻋身类 */ static class Framework { public void init() { // 依赖底盘 Bottom bottom = new Bottom(); bottom.init(); } }/** * 底盘类 */ static class Bottom { public void init() { // 依赖轮胎 Tire tire = new Tire(); tire.init(); } }
/** * 轮胎类 */ static class Tire {
// 尺⼨ private int size = 30; public void init() { System.out.println("轮胎尺⼨:" + size); } }
}

以上程序中,轮胎的尺⼨的固定的,然⽽随着对的⻋的需求量越来越⼤,个性化需求也会越来越多(比如轮胎大小,颜色,材质等等),这时候我们就需要修改轮胎类的代码,但是修改轮胎类代码就会影响到底盘类代码,修改底盘类代码就会影响到车身类代码,依次向上修改。这样的代码存在高度的耦合性。每一次调用链最底层发生改变,如果调用链很长,耦合性很高,那么整个调用链都需要修改代码。现在的需求就是修改任意类,不影响整个调用链,这种做法就叫做解耦

我们将控制权反转,此时,我们只需要将原来由⾃⼰创建的下级类,改为传递的⽅式(也就是注⼊的⽅式),因为我们不需要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦。

public class IocCarExample { public static void main(String[] args) { Tire tire = new Tire(20); Bottom bottom = new Bottom(tire); Framework framework = new Framework(bottom); Car car = new Car(framework); car.run(); } static class Car { private Framework framework; public Car(Framework framework) { this.framework = framework; } public void run() { framework.init(); } }
static class Framework { private Bottom bottom; public Framework(Bottom bottom) { this.bottom = bottom; }public void init() { bottom.init(); } }
static class Bottom { private Tire tire; public Bottom(Tire tire) { this.tire = tire; } public void init() { tire.init(); } } static class Tire { private int size; public Tire(int size) { this.size = size; } public void init() { System.out.println("轮胎:" + size); } }
}

通过解耦,从⽽实现了更加灵活、通⽤的程序设计了。通⽤程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建了Framework,Framework 创建并创建了 Bottom,依次往下,⽽改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊到当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。

既然Spring 是⼀个IoC容器,那么它有两个最核心的功能:把对象存入容器和从容器中取出对象。

当谈到IoC,必然会谈到DI,DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。从广义上老说,IoC和DI其实说的是一回事,但是也有区别的。这样理解,IoC是一种思想,而DI就是这种思想的具体实现。举个例子:今天晚上要去吃一顿好的,这就是一个思想,那今天晚上去吃海底捞吧,吃海底捞这就是DI,一种具体实现。

总结:Spring 是包含了众多⼯具⽅法的 IoC 容器,它里面包含了两个最核心的功能:将对象存入容器,从容器将对象取出来,供其它类使用。跟Spring相关的两个概念,一个是IoC,一个是DI。IoC是一种思想,而DI是这种思想的一种具体实现。

如何理解Spring?相关推荐

  1. 深入理解Spring系列之六:bean初始化

    <深入理解Spring系列之四:BeanDefinition装载前奏曲>中提到,对于非延迟单例bean的初始化在finishBeanFactoryInitialization(beanFa ...

  2. 《深入理解Spring Cloud与微服务构建》出版啦!

    作者简介 方志朋,毕业于武汉理工大学,CSDN博客专家,专注于微服务.大数据等领域,乐于分享,爱好开源,活跃于各大开源社区.著有<史上最简单的Spring Cloud教程>,累计访问量超过 ...

  3. 不同类的方法 事务问题_深入理解 Spring 事务原理

    Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...

  4. 深入理解Spring系列之三:BeanFactory解析

    转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483824&idx=1&sn=9b7c2603093 ...

  5. 透彻理解Spring事务设计思想之手写实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原 ...

  6. 【手写系列】透彻理解Spring事务设计思想之手写实现

    事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Dura ...

  7. 互相引用 spring_巧夺天工,这样理解Spring的IOC、DI下来,真的很清晰了

    前言 你可能会有如下问题: 想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子又忘了本 ...

  8. 深入理解Spring Redis的使用 (一)、Spring Redis基本使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  9. Spring Boot教程(7) – 直观地理解Spring容器

    在你学习Spring之前,你肯定听说过"控制反转"."依赖注入"."上下文"等名词,伴随着这些名词的,是一些冗长晦涩的解释,这些解释并没有什 ...

  10. 用项目案例彻底理解Spring IOC容器

    本篇介绍Spring IOC容器,通过具体的实例详细地讲解IOC概念,彻底理解Spring反转控制的思想.通过本篇的学习,可以达成如下目标. ● 运用工厂模式设计程序 ● 理解JavaBean和POJ ...

最新文章

  1. 椭圆曲线密码学导论pdf_椭圆曲线密码学
  2. 百度之星初赛(A)——T5
  3. “我在B站有套房”成真:云蹦迪、不停学还健身
  4. ArcGIS制图(一)之流向图
  5. linux命令大全---入门篇(菜鸟必会)
  6. 传智播客ajax视频教程 百度云,传智播客AJAX视频资料分享
  7. uipath数据爬取(结构化数据)
  8. HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)
  9. 国家集训队论文99~08年全版
  10. Android常用炫酷风格控件包含项目地址汇总
  11. 【转】实用API大全
  12. 对于程序员的技术发展和职业规划能否给大家一些建议呢?
  13. 小米手机怎么设置来电铃声?超过90%的人都是这样设置的…
  14. 揭密备份恢复的原理!
  15. 关于MyBatis框架的总结
  16. 《信息系统安全》第二章 信息安全模型 作业
  17. 9+11个无版权、高清、免费图片素材网站给你!免费无版权可商用图标、图片素材,需要图片的时候可以上去看看
  18. 【洛谷P3818】小A和uim之大逃离 II
  19. 什么是深度学习以及它是如何工作的?
  20. 使用通达信level2接口自动交易下单有什么特点?

热门文章

  1. 【超硬核】还不知道怎么入门算法?这篇双指针让你吃到饱【力扣真题】+【算法图解】
  2. linux --压缩xz
  3. 关于各种数字倍数的判断
  4. EXCEL关于office和wps对于宏的初体验
  5. java接口与抽象类异同分析
  6. PostgreSQL 数据恢复工具
  7. Excel工作表中最常用的10个经典技巧
  8. “二维码扫描器-客户端
  9. 机器学习线性回归——概念梳理及非线性拟合
  10. Decawave官方双边测距(一对一)原理介绍及代码实现