Spring入门之IOC
IOC/DI:
Spring最核心的灵魂,IOC/DI(控制反转/依赖注入)!,这里一定要理解他,理解这个思想。我会细说什么是IOC/DI、他的思想是什么、它带来了那些好处。
进入正题,先说说什么是ioc,什么又是DI,其实ioc 与 DI 本质上是一个东西,但是他们的概念有所不同,Spring公司称之ioc,民间有部分人称它为DI。
ioc(控制反转)
什么叫控制反转,先从字面上的意思来思考,谁控制谁、控制什么、谁又反转谁、反转是什么。
下面4点我会简单的说明下,如果不明白的先记住这些话,后面会慢慢的讲解
1.谁控制谁?
角色:Spring框架、应用程序(项目)
角色分别是Spring框架、应用程序,在控制反转中,是Spring框架控制着应用程序。
2.控制什么?
Spring框架控制应用程序,具体是控制应用程序的什么? 控制着应用程序对资源的管理(创建对象、对象的关系依赖、给对象属性设置字符串、文件等等,这些都称之为资源)。
3.谁反转谁?
Spring反转应用程序对资源的管理。
4.什么是反转?
什么是反转,有反转就有正转,正转是什么,我们在应用程序(项目)里面new 对象 、给对象赋值 、给对象做关系依赖(这些行为我统称对资源的管理),这些行为都叫正转,而反转就是反过来,这些事情都交给其他人去做,应用程序本身不做了,这就是反转。
把上面4点总结起来就是,Spring控制应用程序对资源的管理,这就是控制反转。
IOC思想:
Spring真正厉害的地方,是它的思想,并不是它的代码,是它这种思想改变了开发的格局,它把以前应用程序对资源的管理给分离出来,全部交给Spring ioc做,提高了开发的效率,让我们专注于业务逻辑及其他方面,不需要去管对象的创建、关系的依赖,想要什么从Spring ioc获取,同时还做到了松散耦合,比如修改对象的依赖关系,特别是对象比较多,关系也比较复杂的情况,如果还是传统的方法,都由应用程序管理资源,那么维护成本会很高,你需要修改大量的代码,降低开发效率,换成是Spring ioc来修改关系,直接在配置文件里面配置即可,应用程序几乎不需要改动代码,下面我会通过画图的形式来讲解思想的演变,你们能更深的体会我说的这些内容与它的思想。
思想的演变
思想1:

这就是正转,任何事情全部由应用程序本身操作,对象的创建、对象的关系依赖、获取外部资源、业务的逻辑,全部混在一起,如果里面的对象多,关系也复杂,维护起来,时间成本非常高,降低我们开发效率,也容易出现bug,而且每次都要重新编译。
思想2:

现在由思想1的正转变成了反转,以前由应用程序中A类做的资源管理(对象的创建、对象的关系依赖、获取外部资源),交给了对象工厂去做,所有的资源都向对象工厂获取,由之前的主动去创建对象、配置关系依赖、获取外部资源,全部变成了被动接收,对象工厂成为了主动,这些东西全是对象广场给你的,但是这样还是不方便,因为你要更换对象还是要去修改工厂CreateC()里面具体创建对象的代码,同样要重新编译。
思想3:

思想3演变成了,工厂获取XML里面配置好的类的全限定名再用反射创建对象,以后要修改对象,直接修改配置文件即,不需要改动代码,也不会重新编译,此时的关系是,应用程序A类被动接收,依赖工厂类,工厂类也变成被动接收,依赖xml配置文件,xml配置文件变成了主动,但是操作起来比较麻烦,比如带参构造器、依赖关系等等,用反射做会十分麻烦。
思想4:

思想4正是现在的讲的IOC,其实IOC的底层原理就是工厂+xml+反射,只不过Spring把他们全部封装的很完善,扩展了很多东西,不需要我们去做任何有关操作对象的事情,只要在XML里面配置好对象的关系即可,Spring会自动帮你创建好,应用程序尽管获取就醒了,现在的关系演变成了,应用程序被动接收,依赖Spring,Spring依赖XML配置文件,XML配置文件主动,需要改变对象修改配置文件即可,与思想3相比,少了加载xml配置文件再通过反射去创建对象的步骤,这些事情Spring全部帮你做好了。
上图的请求流程是 启动项目的时候Spring会去获取XML配置文件里面的关系,再通过反射技术把他们都实例化,并装进ioc容器内,应用程序获取的时候直接问Spring要,Spring从ioc容器中取出来给应用程序。
思想总结:
整个思想的演变,最大的变化就是主动变被动,这是IOC最核心的思想,由应用程序主动管理这些资源演变成Spring来管理,应用程序依赖Spring来获取资源变成被动,Spring来管理这些资源变成了主动。
IOC与DI
IOC与DI讲的是同一件事情,但是角度不一样
1.应用程序角度:
应用程序依赖Spring,依赖Spring给它注入资源,这就是依赖注入DI。
2.Spring角度:
Spring控制应用程序,控制它对资源的管理,这就是控制反转IOC。
Spring入门之IOC的更多相关文章
- Spring入门2. IoC中装配Bean
Spring入门2. IoC中装配Bean 20131125 前言: 上一节学习了Spring在JavaProject中的配置,通过配置文件利用BeanFactory和ApplicationConte ...
- Spring入门1. IoC入门实例
Spring入门1. IoC入门实例 Reference:Java EE轻量级解决方案——S2SH 前言: 之前学习过关于Spring的一点知识,曾经因为配置出现问题,而总是被迫放弃学习这些框架技术, ...
- Spring入门导读——IoC和AOP
和MyBatis系列不同的是,在正式开始Spring入门时,我们先来了解两个关于Spring核心的概念,IoC(Inverse of Control)控制反转和AOP()面向切面编程. 1.IoC(I ...
- Spring入门及IoC的概念
Spring入门 Spring是一个轻量级的Java开发框架,最早由Robd Johnson创建,目的为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,它是一个分层的JavaSE/EE轻量级开源 ...
- Spring入门 (IOC)
1.实现原理
- Spring入门介绍-IOC(二)
浅谈IOC IOC(inversion of control)是Spring的核心,贯穿始终.所谓IOC 就是有Spring来控制对象的生命周期和对象间的关系. 传统开发模式:对象之间相互依赖 IOC ...
- spring入门(Ioc的理解)
spring对依赖的注入理解可以参考这篇:https://www.cnblogs.com/alltime/p/6729295.html 依赖注入和控制反转 传统的JavaEE程序中,直接在内部new一 ...
- Spring_第一个Spring入门案例IOC
今天我们来写我们的第一个spring 第一步 建立一个java project 第二步 添加我们的五个jar文件 第三步 在项目中建立一个com.zk.spring包 第四步 建立我们的userser ...
- Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)
Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...
随机推荐
- 将STM32 iap hex文件与app hex文件合并为一个hex文件
日前公司产品需要增加远程升级功能,boot loader程序写好后交予生产部门使用时他们反馈每个产品程序需要刷写两次(一个boot loader 一个app程序),生产进度变慢浪费时间,于是乎研究如何 ...
- VMware---添加esxi主机的实验
实验环境:window_server_2012_r2_64 SQLServer2012SP1-FullSlipstream-CHS-x64 虚机配置: 关于windows server2012 和 ...
- NFS介绍和安装
NFS简单介绍 NFS 是Network File System的缩写,即网络文件系统. 一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外发布.功能是通过网络让不同的机器.不同的操作 ...
- hdu1181 变形课(vector容器+dfs)
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submi ...
- 《深入理解java虚拟机》笔记——简析java类文件结构
一直不太搞得明确jvm究竟是如何进行类载入的,在看资料的过程中迷迷糊糊.在理解类载入之前,首先看看java的类文件结构究竟是如何的,都包含了哪些内容. 最直接的參考当然是官方文档:The Java® ...
- Python绘制3d螺旋曲线图实例代码
Axes3D.plot(xs, ys, *args, **kwargs) 绘制2D或3D数据 参数 描述 xs, ys X轴,Y轴坐标定点 zs Z值,每一个点的值都是1 zdir 绘制2D集合时使用 ...
- CS:APP3e 深入理解计算机系统_3e Y86-64模拟器指南
详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取. ...
- Intellijidea建javaWeb以及Servlet简单实现
一.创建并设置javaweb工程1.创建javaweb工程File --> New --> Project... 点击Project后出现如下界面,选择Java Enterprise,选中 ...
- 解决model 里 NSInteger类型
#import "CJGWCListModel.h" @implementation CJGWCListModel - (NSInteger)goods_number{ if (_ ...
- Python笔记·第十一章—— 函数 (二) 装饰器
一 为何要用装饰器 有的时候写完一段代码,过段时间需要对它进行升级.添加一些新功能,但是如果要直接修改原来的代码会影响其他人的调用,所以就需要一个不修改源代码且不修改原函数的调用方式的东西又能为原函数 ...