锁定老帖子 主题:我对IoC/DI的理解
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间: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 欢迎一起探讨学习 |
|
返回顶楼 | |
发表时间:2012-04-16
Lz你帖子内留的思考题:ioc/di等同于工厂吗?能给个详细点的答案吗?
|
|
返回顶楼 | |
发表时间:2012-04-17
最后修改:2012-04-17
domainmodel 写道 Lz你帖子内留的思考题:ioc/di等同于工厂吗?能给个详细点的答案吗?
肯定是不等同,两者之间的目的是不相同的。IoC/DI容器可以选择实现工厂这个模式,也可以选择不实现(而是由用户主动往容器里方法)。 |
|
返回顶楼 | |
发表时间:2012-04-17
语言精辟到位,好文
|
|
返回顶楼 | |
发表时间:2012-08-23
此贴很精彩,讨论也很精彩。。。我是一个新手,看完后有个疑问。既然IOC容器负责初始化组件,那么容器又是怎样初始化的呢?不至于每次都得在获取服务的时候都显式声明容器对象吧。。。
|
|
返回顶楼 | |
发表时间:2012-08-23
楼上问题好,不幸的是容器初始化都是new的
|
|
返回顶楼 | |
发表时间:2012-08-24
我勒个去,一直都不知道这些玩意儿还有学名,提拉米苏?
|
|
返回顶楼 | |
发表时间:2012-08-24
a442579302 写道 此贴很精彩,讨论也很精彩。。。我是一个新手,看完后有个疑问。既然IOC容器负责初始化组件,那么容器又是怎样初始化的呢?不至于每次都得在获取服务的时候都显式声明容器对象吧。。。
1、容器属于应用程序的基础设施,可以为每个应用创建一个容器(必须有个点要创建,如我们使用web环境 可以使用监听器创建)。 2、DI的关键思想不是容器,某些容器只是实现了这个模式:DI的本质是: 引用 模式本身不重要,重要的是应该将组件的配置和使用分离开。
2.1、 即组件需要什么服务[我们可以放到配置文件/程序中装配都行 但服务的具体实现可以灵活选择 而不是写死了] 和 组件怎么使用应该分离(说白了是面向接口的一种延伸) 2.2、在此我们其实使用了插拔式(装配)技术,利用这个技术,我们可以为不同的应用程序部署不同的配置,使用是无影响的。 |
|
返回顶楼 | |
发表时间:2012-08-24
vlinux 写道 我勒个去,一直都不知道这些玩意儿还有学名,提拉米苏?
蛋挞 |
|
返回顶楼 | |
发表时间:2012-08-24
jinnianshilongnian 写道 a442579302 写道 此贴很精彩,讨论也很精彩。。。我是一个新手,看完后有个疑问。既然IOC容器负责初始化组件,那么容器又是怎样初始化的呢?不至于每次都得在获取服务的时候都显式声明容器对象吧。。。
1、容器属于应用程序的基础设施,可以为每个应用创建一个容器(必须有个点要创建,如我们使用web环境 可以使用监听器创建)。 2、DI的关键思想不是容器,某些容器只是实现了这个模式:DI的本质是: 引用 模式本身不重要,重要的是应该将组件的配置和使用分离开。
2.1、 即组件需要什么服务[我们可以放到配置文件/程序中装配都行 但服务的具体实现可以灵活选择 而不是写死了] 和 组件怎么使用应该分离(说白了是面向接口的一种延伸) 2.2、在此我们其实使用了插拔式(装配)技术,利用这个技术,我们可以为不同的应用程序部署不同的配置,使用是无影响的。 感谢楼主反复强调什么是IOC和DI,但对于初学者不免有些抽象。还是针对容器初始化的问题,因为我学的时候下过一些demo看,入门的demo是在action中显式创建beanFactory ,再从中获取service组件;而一些整合的demo中,并没有看到这一初始化的过程,我知道是spring做了这些工作。但具体怎么做的呢?包括怎么配置?原理?。。。渴望楼主帮个忙解答一下,谢了 |
|
返回顶楼 | |