`
jinnianshilongnian
  • 浏览: 21434047 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404982
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997639
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631433
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257561
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593147
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248965
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847500
Group-logo
跟我学Nginx+Lua开...
浏览量:698136
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780438
社区版块
存档分类
最新评论

我对IoC/DI的理解

阅读更多

 


IoC

 

IoC Inversion of Control,控制反转, 控制权从应用程序转移到框架(如IoC容器),是框架共有特性

 

1、为什么需要IoC容器
1.1、应用程序主动控制对象的实例化及依赖装配 
A a = new AImpl();
B b = new BImpl();
a.setB(b);
本质:创建对象,主动实例化,直接获取依赖,主动装配 
缺点:更换实现需要重新编译源代码
           很难更换实现、难于测试
           耦合实例生产者和实例消费者 

A a = AFactory.createA();
B b = BFactory.createB();
a.setB(b);
 
本质:创建对象,被动实例化,间接获取依赖,主动装配  (简单工厂) 
缺点:更换实现需要重新编译源代码
           很难更换实现、难于测试


A a = Factory.create(“a”);
B b = Factory.create(“b”);
a.setB(b); 

  <!—配置.properties-->
a=AImpl
b=BImpl
 
本质:创建对象,被动实例化,间接获取依赖, 主动装配
        (工厂+反射+properties配置文件、
           Service Locator、注册表) 
缺点:冗余的依赖装配逻辑


我想直接:
    //返回装配好的a
A a = Factory.create(“a”); 

              
1.2、可配置通用工厂:工厂主动控制,应用程序被动接受,控制权从应用程序转移到工厂
//返回装配好的a 
A a = Factory.create(“a”);
   <!—配置文件-->
<bean id=“a” class=“AImpl”>
    <property name=“b” ref=“b”/>
</bean>
<bean id=“b” class=“BImpl”/>
 本质:创建对象和装配对象, 
          被动实例化,被动接受依赖,被动装配
        (工厂+反射+xml配置文件)
缺点:不通用

步骤:
1、读取配置文件根据配置文件通过反射
创建AImpl
2、发现A需要一个类型为B的属性b
3、到工厂中找名为b的对象,发现没有,读取
配置文件通过反射创建BImpl
4、将b对象装配到a对象的b属性上
【组件的配置与使用分离开(解耦、更改实现无需修改源代码、易于更好实现) 】

1.3、 IoC(控制反转)容器:容器主动控制
//返回装配好的a 
A a = ApplicationContext.getBean(“a”);
 <!—配置文件-->
<bean id=“a” class=“AImpl”>
    <property name=“b” ref=“b”/>
</bean>
<bean id=“b” class=“BImpl”/>
 
本质:创建对象和装配对象、管理对象生命周期
          被动实例化,被动接受依赖,被动装配
        (工厂+反射+xml配置文件)
通用 


 

IoC容器:实现了IoC思想的容器就是IoC容器

2、IoC容器特点
1无需主动new对象;而是描述对象应该如何被创建即可
         IoC容器帮你创建,即被动实例化;
2】不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),
        IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;
3】主动变被动,好莱坞法则:别打电话给我们,我们会打给你;
4】迪米特法则(最少知识原则):不知道依赖的具体实现,只知道需要提供某类服务的对象(面向抽象编程),松散耦合,一个对象应当对其他对象有尽可能少的了解,不和陌生人(实现)说话
5IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。

3、理解IoC容器问题关键:控制的哪些方面被反转了?
1、谁控制谁?为什么叫反转? ------ IoC容器控制,而以前是应用程序控制,所以叫反转 
2、控制什么?               ------ 控制应用程序所需要的资源(对象、文件……
3、为什么控制?             ------ 解耦组件之间的关系 
4、控制的哪些方面被反转了? ------ 程序的控制权发生了反转:从应用程序转移到了IoC容器。 

思考:
    1: IoC/DI等同于工厂吗?
    2: IoC/DI跟以前的方式有什么不一样?
领会:主从换位的思想

 

4、实现了IoC思想的容器就是轻量级容器吗
如果仅仅因为使用了控制反转就认为这些轻量级容器与众不同,就好象在说我的轿车与众不同因为它有四个轮子? 

容器:提供组件运行环境,管理组件声明周期(不管组件如何创建的以及组件之间关系如何装配的);

IoC容器不仅仅具有容器的功能,而且还具有一些其他特性---如依赖装配
             
控制反转概念太广泛,让人迷惑,后来Martin Fowler 提出依赖注入概念
Martin Fowler  Inversion of Control Containers and the Dependency Injection pattern  
http://martinfowler.com/articles/injection.html


DI

2、什么是DI
DI:依赖注入(Dependency Injection :用一个单独的对象(装配器)来装配对象之间的依赖关系 



2、理解DI问题关键
谁依赖于谁?           -------   应用程序依赖于IoC容器
为什么需要依赖?        -------   应用程序依赖于IoC容器装配类之间的关系
依赖什么东西?          -------   依赖了IoC容器的装配功能
谁注入于谁?            -------   IoC容器注入应用程序
注入什么东西?          -------   注入应用程序需要的资源(类之间的关系)
 
更能描述容器其特点的名字——“依赖注入”(Dependency Injection
IoC容器应该具有依赖注入功能,因此也可以叫DI容器 

3、DI优点
    1】帮你看清组件之间的依赖关系,只需要观察依赖注入的机制(setter/构造器),就可以掌握整个依赖(类与类之间的关系)。
    2】组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
    3依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现。

使用DI限制:组件和装配器(IoC容器)之间不会有依赖关系,因此组件无法从装配器那里获得更多服务,只能获得配置信息中所提供的那些。 

4、实现方式
   1、构造器注入
   2、setter注入
   3、接口注入:在接口中定义需要注入的信息,并通过接口完成注入
       @Autowired
       public void prepare(MovieCatalog movieCatalog,
           CustomerPreferenceDao customerPreferenceDao) {
           this.movieCatalog = movieCatalog;
           this.customerPreferenceDao = customerPreferenceDao;
       }



使用IoC/DI容器开发需要改变的思路
1、应用程序不主动创建对象,但要描述创建它们的方式。
2、在应用程序代码中不直接进行服务的装配,但要配置文件中描述哪一个组件需要哪一项服务。容器负责将这些装配在一起。

其原理是基于OO设计原则的The Hollywood PrincipleDon‘t call us, we’ll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和装配都由容器负责。组件处在一个容器当中,由容器负责管理。

IoC容器功能:实例化、初始化组件、装配组件依赖关系、负责组件生命周期管理。

本质:
      IoC:控制权的转移,由应用程序转移到框架;
      IoC/DI容器:应用程序主动实例化对象被动等待对象(被动实例化);
      DI:  由专门的装配器装配组件之间的关系;
      IoC/DI容器:应用程序主动装配对象的依赖应用程序被动接受依赖

关于IoC/DI与DIP之间的关系 详见 http://www.iteye.com/topic/1122310?page=5#2335746

 

IoC/DI与迪米特法则 详见http://www.iteye.com/topic/1122310?page=5#2335748

37
8
分享到:
评论
16 楼 13592539017 2016-10-22  
牛逼  以后多来学习
15 楼 oldmeng 2014-10-21  
一句话:
抽象依赖具体 转为 具体依赖抽象
14 楼 changxianbest 2014-09-17  
写得很好!
13 楼 hft24dq 2014-06-23  
看了一天各位总结的关于IOC与DI的文章,你这篇最棒,有总结,很实在!
12 楼 jinnianshilongnian 2012-11-21  
xustmath 写道
没看太明白IOC和DI的区别,
【2】不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),
        IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;
这个和DI说的不就是一回事吗,为什么会有如下说法:
4、实现了IoC思想的容器就是轻量级容器吗?
如果仅仅因为使用了控制反转就认为这些轻量级容器与众不同,就好象在说我的轿车与众不同因为它有四个轮子?

DI比IoC更能说明容器的作用  即 DI是窄化的IoC
11 楼 xustmath 2012-11-21  
没看太明白IOC和DI的区别,
【2】不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),
        IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;
这个和DI说的不就是一回事吗,为什么会有如下说法:
4、实现了IoC思想的容器就是轻量级容器吗?
如果仅仅因为使用了控制反转就认为这些轻量级容器与众不同,就好象在说我的轿车与众不同因为它有四个轮子?
10 楼 jinnianshilongnian 2012-08-02  
背靠背拥抱 写道
不错,正在找IoC的资料

谢谢啊
9 楼 背靠背拥抱 2012-08-02  
不错,正在找IoC的资料
8 楼 jinnianshilongnian 2012-04-02  
ecustz 写道
学习了,以后有啥spring方面的问题希望向你多多请教咯

一起学习
7 楼 ecustz 2012-04-02  
学习了,以后有啥spring方面的问题希望向你多多请教咯
6 楼 jinnianshilongnian 2012-04-01  
chengwl 写道

5 楼 chengwl 2012-04-01  
4 楼 jinnianshilongnian 2012-04-01  
ajavamark 写道
思路清晰,分析细致,学习学习,java私塾-开涛的文章必须顶顶。

3 楼 jinnianshilongnian 2012-04-01  
fengx 写道
学习啦 讲的挺透彻

谢谢
2 楼 ajavamark 2012-03-31  
思路清晰,分析细致,学习学习,java私塾-开涛的文章必须顶顶。
1 楼 fengx 2012-03-31  
学习啦 讲的挺透彻

相关推荐

    IOC(DI)与AOP概念的理解

    IOC(DI)与AOP概念的理解

    关于spring的AOP ,IOC,DI的理解

    帮助初学者理解spring框架,有助于提高代码能力java.sql.SQLException: Duplicate entry '2' for key 'PRIMARY' Query: insert into transaction values(?,?,?,?,?) Parameters: [2, 6212999999999, 转出, 6000000, ...

    深入理解DIP、IoC、DI以及IoC容器

    其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC、DI以及Ioc容器等概念。通过本文我们将一起学习这些概念,并理清他们之间微妙的关系。对于大部分小菜来说,当听到大牛们高谈DIP、IoC、DI以及...

    di_ioc_c#.zip

    依赖注入和IoC乍一看似乎很复杂,但是它们很容易学习和理解。 在本文中,我们将通过在C#中重构一个非常简单的代码示例来说明依赖注入和IoC容器。

    由浅入深理解 IOC 和 DI.pdf

    对扩展开放,对修改封闭。 修改一处代码可能会引起其他地方的 bug ,最好的方式就是新增业务模块/类代替原来的业务 模块/类,使出现 bug 的几率变小。 必须满足此原则的代码才能算作好的可维护的代码

    理解php依赖注入和控制反转

    IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。 2、依赖:谁...

    Spring——IOC(控制反转)与DI(依赖注入).docx

    IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。在没有IOC的程序中,我们使用面向对象编程,对象的创建于对象间的依赖完全硬编码在程序中,对象的...

    IOC之深入理解SpringIoC

    IoC全称为InversionofControl,翻译为“控制反转”,它还有一个别名为DI(DependencyInjection),即依赖注入。如何理解“控制反转”好呢?理解好它的关键在于我们需要回答如下四个问题:谁控制谁控制什么为何是反转...

    手写IOC项目,学习理解Spring IOC原理

    我们都知道,Spring框架的IOC是基于Java的反射机制实现,实现IOC,...IOC和DI是Spring里面最核心的东西,,资源中会写出这两个模块。资源内容包括Java反射机制的实践,使用反射机制实现IOC(包括依赖注入和对象创建)。

    10-IoC配置-依赖注入概念(DI)

    我相信很多朋友学习IOC概念的时候,查找了很多资料结果还是一头雾水,感觉高深难懂或者一知半解,而我这篇博客就是以通俗易懂的话语,用故事的方式,讲解IOC(控制反转)和DI(依赖注入)的概念,让大家不再晕,不再觉得...

    spring杂谈 作者zhang KaiTao

    1.4 我对IoC/DI的理解 1.5 SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结 1.6 »Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了) 1.7 Spring开闭原则的表现-BeanPostProcessor...

    DI 设计模式.docx

    拜读过Martin Fowler大师的关于IOC容器和DI模式的大作,深感受益匪浅,恰逢正在开发的项目使用了这种技术,因此也想班门弄斧,谈一下自己对IOC容器以及依赖注入的一点理解。 仅凭自己对Martin Fowler大师的大作一点...

    CH02-IOC依赖注入.pptx

    理解什么是IoC和DI。 理解构造注入 理解不同数据类型的注入方法 掌握p命名空间注入 Bean自动装配

    Spring IOC的快速入门案例

    Spring IOC的快速入门案例 &gt;下载Spring的开发包 ...&gt;理解IOC控制反转和DI依赖注入 &gt;编写Spring核心配置文件 &gt;在程序中读取Spring配置文件,通过Spring框架获得Bean,完成相应操作 Spring 4.x的目录结构  

    简单谈谈Spring Ioc原理解析

    、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。

    AngularJS学习第二篇 AngularJS依赖注入

    这里使用了容器B(是指用来实现 IOC/DI 功能的一个框架程序)。 A需要访问C B获取C然后返回给A IOC inversion of control 控制反转:站在容器角度。B控制A,由B反向的向A注入C。即容器控制应用程序,由容器反向的向...

    博客中SpringOIC、DI案列文章工程代码

    该资源为本人博客文章“什么是SpringIOC?如何理解SpringIOC?”和“解析Spring DI 依赖注入的5种方式”中SpringOIC、DI演示案列文章工程代码,可下载学习!

    jsp编程技术复习题

    IOC(Inverse of Control控制反转):从字面上理解就是控制反转了,将对在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建...

Global site tag (gtag.js) - Google Analytics