论坛首页 Java企业应用论坛

我对IoC/DI的理解

浏览 40880 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-04-16  
yabo 写道
DI实际上是把对象的创建过程/逻辑从使用/业务逻辑中分离了出来。通常来说,创建只要最开始做一次,然后就与后面的使用没有关系了。于是抽取出来符合“把变化速率一样的逻辑放在一起”这条原则。同时,由于抽取了创建逻辑,具体的对象依赖关系(对象图)也就不需要应用代码来维护了(交给DI容器了)。


我认为DI属于基础设施,跟业务逻辑无关,我总结了使用DI后要改变的开发思路:

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


DI定义
引用
DI:依赖注入(Dependency Injection) :用一个单独的对象(装配器)来装配对象之间的依赖关系 。


关于IoC/DI与DIP之间的关系 详见 [url]http://www.iteye.com/topic/1122310?page=5#2335746 [/url]
IoC/DI与迪米特法则 详见http://www.iteye.com/topic/1122310?page=5#2335748

欢迎一起探讨学习 
0 请登录后投票
   发表时间:2012-04-16  
Lz你帖子内留的思考题:ioc/di等同于工厂吗?能给个详细点的答案吗?
0 请登录后投票
   发表时间:2012-04-17   最后修改:2012-04-17
domainmodel 写道
Lz你帖子内留的思考题:ioc/di等同于工厂吗?能给个详细点的答案吗?

肯定是不等同,两者之间的目的是不相同的。IoC/DI容器可以选择实现工厂这个模式,也可以选择不实现(而是由用户主动往容器里方法)。
0 请登录后投票
   发表时间:2012-04-17  
语言精辟到位,好文
0 请登录后投票
   发表时间:2012-08-23  
此贴很精彩,讨论也很精彩。。。我是一个新手,看完后有个疑问。既然IOC容器负责初始化组件,那么容器又是怎样初始化的呢?不至于每次都得在获取服务的时候都显式声明容器对象吧。。。
0 请登录后投票
   发表时间:2012-08-23  
楼上问题好,不幸的是容器初始化都是new的
0 请登录后投票
   发表时间:2012-08-24  
我勒个去,一直都不知道这些玩意儿还有学名,提拉米苏?
0 请登录后投票
   发表时间:2012-08-24  
a442579302 写道
此贴很精彩,讨论也很精彩。。。我是一个新手,看完后有个疑问。既然IOC容器负责初始化组件,那么容器又是怎样初始化的呢?不至于每次都得在获取服务的时候都显式声明容器对象吧。。。

1、容器属于应用程序的基础设施,可以为每个应用创建一个容器(必须有个点要创建,如我们使用web环境 可以使用监听器创建)。

2、DI的关键思想不是容器,某些容器只是实现了这个模式:DI的本质是:
引用
模式本身不重要,重要的是应该将组件的配置和使用分离开。

  2.1、 即组件需要什么服务[我们可以放到配置文件/程序中装配都行 但服务的具体实现可以灵活选择 而不是写死了] 和 组件怎么使用应该分离(说白了是面向接口的一种延伸)
  2.2、在此我们其实使用了插拔式(装配)技术,利用这个技术,我们可以为不同的应用程序部署不同的配置,使用是无影响的。
0 请登录后投票
   发表时间:2012-08-24  
vlinux 写道
我勒个去,一直都不知道这些玩意儿还有学名,提拉米苏?


蛋挞 
0 请登录后投票
   发表时间:2012-08-24  
jinnianshilongnian 写道
a442579302 写道
此贴很精彩,讨论也很精彩。。。我是一个新手,看完后有个疑问。既然IOC容器负责初始化组件,那么容器又是怎样初始化的呢?不至于每次都得在获取服务的时候都显式声明容器对象吧。。。

1、容器属于应用程序的基础设施,可以为每个应用创建一个容器(必须有个点要创建,如我们使用web环境 可以使用监听器创建)。

2、DI的关键思想不是容器,某些容器只是实现了这个模式:DI的本质是:
引用
模式本身不重要,重要的是应该将组件的配置和使用分离开。

  2.1、 即组件需要什么服务[我们可以放到配置文件/程序中装配都行 但服务的具体实现可以灵活选择 而不是写死了] 和 组件怎么使用应该分离(说白了是面向接口的一种延伸)
  2.2、在此我们其实使用了插拔式(装配)技术,利用这个技术,我们可以为不同的应用程序部署不同的配置,使用是无影响的。


感谢楼主反复强调什么是IOC和DI,但对于初学者不免有些抽象。还是针对容器初始化的问题,因为我学的时候下过一些demo看,入门的demo是在action中显式创建beanFactory ,再从中获取service组件;而一些整合的demo中,并没有看到这一初始化的过程,我知道是spring做了这些工作。但具体怎么做的呢?包括怎么配置?原理?。。。渴望楼主帮个忙解答一下,谢了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics