Spring学习第二天:Spring_IOC&DI概述
2016-09-11 22:44
387 查看
IOC&DI概述
IOC(Inversion of Control):其思想是反转资源获取的方向。传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动地将资源推送给他所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源,这种行为也被称为查找的被动形式。
DI(Dependency Injection): IOC的另一种表示方式:即组件以一些预先定义好的方式(如:setter方式)接受来自如容器的资源注入,相对于IOC而言,这种表述更直接。
有如下两个类:
现有如下需求:
从容器中获取 B 对象,并使 B 对象的 a 属性被赋值为容器中 A 对象的引用
UML图如下:
传统的方式:
A a = getA();
B b = getB();
b.setA(a);
使用IOC容器:
容器自动帮我们做好了关联关系,把A对象的引用直接通过set方法给了B对象中a的成员变量。
所以我们只需要获得B对象就可以了。
B b = getB();
这就是IOC容器的效果。
IOC的前生:
IOC的发展可以分为三个阶段
结合如下需求进行分析:生成HTML或PDF格式的不同类型的报表
第一阶段:分离接口和实现
有一个接口ReportGenerator,姑且叫它报表生成器,它有两种方式,一种是Html生成方式,一种是PDF生成方式。
现在有一个报表服务类需要用这个报表生成器。有可能用的是PDF的方式,也有可能用的是Html的方式。
此时最常用的方式是从service中画出三条线,这既需要知道接口类型,也需要知道具体的实现类,而且可能还需要知道如何去创建实现类的对象,这是耦合度最高的一种方式。
就是在说在service中需要知道接口,还需要知道接口的每个实现类的细节。
打个比方:在远古时代,原始人需要一把斧子,他不仅需要知道这把斧子的形状,他还需要知道如何打造一把斧子。这个要求是非常高的。
第二阶段:采用工厂设计模式
现在到了封建社会,我需要一把斧子,我只要带着银子去铁匠铺,让他给我做一把斧子。这个时候耦合度就降低了。
Service只需要画出两条线。一条线是我需要知道接口类型,同时,另一条线指向工厂就可以。这个工厂会帮我生成接口的实现类。
这样在service角度看用起来会更加舒服,但这会导致代码复杂度增加。
于此同时,代码分工更加明确,更有利于扩展,项目也更加灵活。
第三阶段:采用反转控制
到了现在社会,实现了按需分配。我需要什么,你给我什么。
Service只需要画出一条线,由容器把我需要的generator的实现类直接注入给我就可以了。
也就是假设我需要一把斧子,我只需要在院子里面放一个可以装斧子的小框子,就有人会把斧子放在我的框子里。
总结一下:
以前在service中需要一个dao,要么使用new,要么使用工厂方式来获取对象,现在使用依赖注入可以避免这些操作。
其实到目前为止,这一部分光看视频还是感觉云里雾里,打算结合书本进行深入研究。
欢迎大神们指导斧正。
IOC(Inversion of Control):其思想是反转资源获取的方向。传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动地将资源推送给他所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源,这种行为也被称为查找的被动形式。
DI(Dependency Injection): IOC的另一种表示方式:即组件以一些预先定义好的方式(如:setter方式)接受来自如容器的资源注入,相对于IOC而言,这种表述更直接。
有如下两个类:
class A{} class B{ private A a; public void setA(A a){ this.a = a; } }
现有如下需求:
从容器中获取 B 对象,并使 B 对象的 a 属性被赋值为容器中 A 对象的引用
UML图如下:
传统的方式:
A a = getA();
B b = getB();
b.setA(a);
使用IOC容器:
容器自动帮我们做好了关联关系,把A对象的引用直接通过set方法给了B对象中a的成员变量。
所以我们只需要获得B对象就可以了。
B b = getB();
这就是IOC容器的效果。
IOC的前生:
IOC的发展可以分为三个阶段
结合如下需求进行分析:生成HTML或PDF格式的不同类型的报表
第一阶段:分离接口和实现
有一个接口ReportGenerator,姑且叫它报表生成器,它有两种方式,一种是Html生成方式,一种是PDF生成方式。
现在有一个报表服务类需要用这个报表生成器。有可能用的是PDF的方式,也有可能用的是Html的方式。
此时最常用的方式是从service中画出三条线,这既需要知道接口类型,也需要知道具体的实现类,而且可能还需要知道如何去创建实现类的对象,这是耦合度最高的一种方式。
就是在说在service中需要知道接口,还需要知道接口的每个实现类的细节。
打个比方:在远古时代,原始人需要一把斧子,他不仅需要知道这把斧子的形状,他还需要知道如何打造一把斧子。这个要求是非常高的。
第二阶段:采用工厂设计模式
现在到了封建社会,我需要一把斧子,我只要带着银子去铁匠铺,让他给我做一把斧子。这个时候耦合度就降低了。
Service只需要画出两条线。一条线是我需要知道接口类型,同时,另一条线指向工厂就可以。这个工厂会帮我生成接口的实现类。
这样在service角度看用起来会更加舒服,但这会导致代码复杂度增加。
于此同时,代码分工更加明确,更有利于扩展,项目也更加灵活。
第三阶段:采用反转控制
到了现在社会,实现了按需分配。我需要什么,你给我什么。
Service只需要画出一条线,由容器把我需要的generator的实现类直接注入给我就可以了。
也就是假设我需要一把斧子,我只需要在院子里面放一个可以装斧子的小框子,就有人会把斧子放在我的框子里。
总结一下:
以前在service中需要一个dao,要么使用new,要么使用工厂方式来获取对象,现在使用依赖注入可以避免这些操作。
其实到目前为止,这一部分光看视频还是感觉云里雾里,打算结合书本进行深入研究。
欢迎大神们指导斧正。
相关文章推荐
- spring学习总结(二):IOC & DI 概述及 IOC 容器
- spring_1-4,IOC&DI概述_配置 Bean_属性配置细节
- Spring IOC 学习笔记(一) IoC和DI概述
- spring学习总结(三):IOC & DI 配置 Bean 之配置形式及依赖注入方式
- spring学习总结(七):IOC & DI 配置Bean之bean的生命周期及bean的配置方式
- spring学习总结(四):IOC & DI 配置 Bean 之注入属性细节
- 2.Spring学习笔记_IOC&DI概述(by尚硅谷_佟刚)
- spring学习总结(五):IOC & DI 配置 Bean 之自动装配及bean之间的关系
- spring学习总结(六):IOC & DI 配置Bean之作用域、加载外部属性文件、SPEL
- (二)Spring的IOC&DI概述
- Spring_IOC&DI概述
- Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)
- 【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】
- 【Spring学习】IoC与DI
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.5 Bean的生命周期
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.5 Bean的生命周期
- Spring 第二天:ioc,di的概念,使用接口配合dj来编程
- Spring学习—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)
- 学习《spring 3.x企业应用开发实战》之IOC容器概述
- Spring学习总结 —— IoC/DI