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:控制反转,比如:有一个 ...
随机推荐
- 【本地资源路径&&网络资源路径&&正反斜杠在Java中的用法】
一.概念和用法 左正右反 先来看看转义字符的概念:通过 \ ,?来转变后面字母或符号的含义.意思就是改变字母本身的含义. 以"\"符号为例,JAVA中有很多操作,例如文件操作等,需 ...
- 》》3D轮播
* { margin: 0; padding: 0; } .slide { position: absolute; top: calc(50% - 150px); left: calc(50% - 3 ...
- FPGA编程基础(一)--參数传递与寄存器使用
一.參数映射 參数映射的功能就是实现參数化元件.所谓的"參数化元件"就是指元件的某些參数是可调的,通过调整这些參数从而可实现一类结构类似而功能不同的电路.在应用中.非常多电路都可採 ...
- poj 3168 Barn Expansion 几何yy
题链:http://poj.org/problem? id=3168 Barn Expansion Time Limit: 1000MS Memory Limit: 65536K Total Su ...
- HPUX 11.31 MC-SG SGeRAC配置
HPUX 11.31 MC-SG SGeRAC配置 环境: 系统版本号 hp-unix 11.3v2 1503 serviceguard extension版本号 T1907 实施 1. 磁盘空间划分 ...
- Nginx优点
1.高并发响应性能非常好,官方Nginx处理静态文件并发5w/s 2.反向代码性能非常强(可用于负载均衡) 3.内存和cpu占比率低(为Apache的1/5-1/10); 4.对后端服务有健康检查功能 ...
- mysql版本升级
环境 mysql安装在centos上,需要升级. mysql的版本是 mysql> select version(); +-----------+ | version() | +-------- ...
- 使用SplitContainer来实现隐藏窗口的部分内容(转)
有两种方法: (1) Splitter:比较老的方法 (2) SplitContainer:比较新的方法 最终界面如下: 方法一:使用Splitter实现 (1) 在窗口中添加一个Panel控件,即P ...
- 正则表达式与grep
一.回溯引用 1.将页面中合法的标题找出来,使用回溯引用匹配 (需要使用 -E 或 -P 来扩展grep语法支持) 2.查找连续出现的单词 二.前后查找 (grep 只能使用 -P 选项) 1. 向前 ...
- Selenide UI 自动化测试
我没有拼写错误,确实不是 Selenium ,但是,只要是 Web UI 自动化测试框架,基本上都是基于Selenium 的.Selenide 也不例外.那为啥不直接用Selenium呢? 因为 ...