论坛首页 Java企业应用论坛

我对IoC/DI的理解

浏览 39442 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-04-01  
太理论了,缺少代码的说明
0 请登录后投票
   发表时间:2012-04-01  
jyjava 写道
太理论了,缺少代码的说明


好吧,我的失误。。。
0 请登录后投票
   发表时间:2012-04-01  
leonayx123 写道
wjm19870226 写道
LZ,你好。spring的两个特性就是IOC和AOP。被你这么一说,我就分不清IOC和DI什么区别和联系了?


AOP是切面。意思是,你要写一个服务。可以通过切面帮你形成一个代理。
在你的服务里方法执行前,返回值后,出现异常等情况里插入了一些操作。
怎么实现,其实是偷偷的继承了你的类,重写了你的方法。在调用时,调用的是这个隐藏的子类(代理类)。对你屏蔽了起来。

ioc是控制反转,意思是说,你要实例化一个对象,不是自己new一个。而是从工厂里给你分一个。实例化的过程教给了工厂

di是依赖注入。你可以把数据通过配置文件set到你的实例里(其实还有接口注入,构造器注入)。而不是通过 实例.setxxx()方法来给实例里的成员赋值。



AOP不是切面,是面向切面编程,要理解切面要先理解:


概念:

关注点:可以认为是所关注的任何东西,比如上边的支付组件;

关注点分离:将问题细化为单独部分,即可以理解为不可再分割的组件,如上边的日志组件和支付组件;

横切关注点:会在多个模块中出现,使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进,如日志组件横切于支付组件。

织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中从而完成需要的功能,因此需要织入,织入可能在编译期、加载期、运行期等进行。


切面就是横切关注点的模块化

自己总结的资料,看看对不?

0 请登录后投票
   发表时间:2012-04-01  
jinnianshilongnian 写道
leonayx123 写道
你始终没有提到ioc/di的实现原理上。如何用反射实现。
两个最主要的名词“beanwraper” “beanfactory”。
我觉得 前面讲的一堆东西有点虚。

再上一层,关于bean的托管。

最近我在学习ejb。
我觉得spring之所以称为轻量级容器,是因为在ipc/di ,aop上
它替代了ejb工程中中间件的功能。甚至有想法,觉得spring就是根据ejb的思路做的轻量级实现。

这里有个很好的spring源码的帖子,分享给你。
http://www.iteye.com/topic/1120717


此处只是我的理解,只是简单讲讲发展历程,不涉及实现
我这篇博客涉及基础部分http://jinnianshilongnian.iteye.com/blog/1415463

spring中,BeanDefinition + BeanFactory 是基础,BeanWapper简化Bean的实例化和装配,简化JavaBean一些操作。



恩 去学习下你的分享~感谢分享。
0 请登录后投票
   发表时间:2012-04-01  
leonayx123 写道
wjm19870226 写道
LZ,你好。spring的两个特性就是IOC和AOP。被你这么一说,我就分不清IOC和DI什么区别和联系了?


AOP是切面。意思是,你要写一个服务。可以通过切面帮你形成一个代理。
在你的服务里方法执行前,返回值后,出现异常等情况里插入了一些操作。
怎么实现,其实是偷偷的继承了你的类,重写了你的方法。在调用时,调用的是这个隐藏的子类(代理类)。对你屏蔽了起来。

ioc是控制反转,意思是说,你要实例化一个对象,不是自己new一个。而是从工厂里给你分一个。实例化的过程教给了工厂

di是依赖注入。你可以把数据通过配置文件set到你的实例里(其实还有接口注入,构造器注入)。而不是通过 实例.setxxx()方法来给实例里的成员赋值。



IoC: 控制反转(控制权的换位),框架共性,只要是框架就具有的特性。

IoC只是一种思想,控制反转,只要控制权转移就是控制反转,
引用
你要实例化一个对象,不是自己new一个。而是从工厂里给你分一个。实例化的过程教给了工厂
,这个是IoC容器的作用。


我总结的IoC容器的几点作用: 实例化、初始化组件、提供组件运行环境、管理组件声明周期

DI:用一个单独的对象(装配器)来装配对象之间的依赖关系 。

DI:常见的有 setter、构造器、接口注入,,但DI并没有说必须是这三种,其实我们只要注入依赖关系即可,如字段注入通过Spring注解也是可以的。
0 请登录后投票
   发表时间:2012-04-01  
leonayx123 写道
jinnianshilongnian 写道
leonayx123 写道
你始终没有提到ioc/di的实现原理上。如何用反射实现。
两个最主要的名词“beanwraper” “beanfactory”。
我觉得 前面讲的一堆东西有点虚。

再上一层,关于bean的托管。

最近我在学习ejb。
我觉得spring之所以称为轻量级容器,是因为在ipc/di ,aop上
它替代了ejb工程中中间件的功能。甚至有想法,觉得spring就是根据ejb的思路做的轻量级实现。

这里有个很好的spring源码的帖子,分享给你。
http://www.iteye.com/topic/1120717


此处只是我的理解,只是简单讲讲发展历程,不涉及实现
我这篇博客涉及基础部分http://jinnianshilongnian.iteye.com/blog/1415463

spring中,BeanDefinition + BeanFactory 是基础,BeanWapper简化Bean的实例化和装配,简化JavaBean一些操作。



恩 去学习下你的分享~感谢分享。


反正是一起学习,对不对的说说自己的看法
0 请登录后投票
   发表时间:2012-04-01  
jinnianshilongnian 写道
leonayx123 写道
wjm19870226 写道
LZ,你好。spring的两个特性就是IOC和AOP。被你这么一说,我就分不清IOC和DI什么区别和联系了?


AOP是切面。意思是,你要写一个服务。可以通过切面帮你形成一个代理。
在你的服务里方法执行前,返回值后,出现异常等情况里插入了一些操作。
怎么实现,其实是偷偷的继承了你的类,重写了你的方法。在调用时,调用的是这个隐藏的子类(代理类)。对你屏蔽了起来。

ioc是控制反转,意思是说,你要实例化一个对象,不是自己new一个。而是从工厂里给你分一个。实例化的过程教给了工厂

di是依赖注入。你可以把数据通过配置文件set到你的实例里(其实还有接口注入,构造器注入)。而不是通过 实例.setxxx()方法来给实例里的成员赋值。



AOP不是切面,是面向切面编程,要理解切面要先理解:


概念:

关注点:可以认为是所关注的任何东西,比如上边的支付组件;

关注点分离:将问题细化为单独部分,即可以理解为不可再分割的组件,如上边的日志组件和支付组件;

横切关注点:会在多个模块中出现,使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进,如日志组件横切于支付组件。

织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中从而完成需要的功能,因此需要织入,织入可能在编译期、加载期、运行期等进行。


切面就是横切关注点的模块化

自己总结的资料,看看对不?



你这些资料是那本书的?和我学习的资料有些不一样。不过我觉得你这本翻译的也许更合理一些。
“关注点”,这么理解或许比我的资料里 翻译成 “通知”更合理一些。你整理的知识很正确,很专业。
就是太抽象。
我刚才是想给那位同学举些更简单,更方便理解的例子。最近在带实习生有种感觉,这么讲理论他们听不懂。。得说的更。。。面向孩子一些。。
0 请登录后投票
   发表时间:2012-04-01  
leonayx123 写道
jinnianshilongnian 写道
leonayx123 写道
wjm19870226 写道
LZ,你好。spring的两个特性就是IOC和AOP。被你这么一说,我就分不清IOC和DI什么区别和联系了?


AOP是切面。意思是,你要写一个服务。可以通过切面帮你形成一个代理。
在你的服务里方法执行前,返回值后,出现异常等情况里插入了一些操作。
怎么实现,其实是偷偷的继承了你的类,重写了你的方法。在调用时,调用的是这个隐藏的子类(代理类)。对你屏蔽了起来。

ioc是控制反转,意思是说,你要实例化一个对象,不是自己new一个。而是从工厂里给你分一个。实例化的过程教给了工厂

di是依赖注入。你可以把数据通过配置文件set到你的实例里(其实还有接口注入,构造器注入)。而不是通过 实例.setxxx()方法来给实例里的成员赋值。



AOP不是切面,是面向切面编程,要理解切面要先理解:


概念:

关注点:可以认为是所关注的任何东西,比如上边的支付组件;

关注点分离:将问题细化为单独部分,即可以理解为不可再分割的组件,如上边的日志组件和支付组件;

横切关注点:会在多个模块中出现,使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进,如日志组件横切于支付组件。

织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中从而完成需要的功能,因此需要织入,织入可能在编译期、加载期、运行期等进行。


切面就是横切关注点的模块化

自己总结的资料,看看对不?



你这些资料是那本书的?和我学习的资料有些不一样。不过我觉得你这本翻译的也许更合理一些。
“关注点”,这么理解或许比我的资料里 翻译成 “通知”更合理一些。你整理的知识很正确,很专业。
就是太抽象。
我刚才是想给那位同学举些更简单,更方便理解的例子。最近在带实习生有种感觉,这么讲理论他们听不懂。。得说的更。。。面向孩子一些。。


这是我自己总结的 。 哈哈哈,对,初学者最好给他们看图
0 请登录后投票
   发表时间:2012-04-01   最后修改:2012-04-01
引用

DI:用一个单独的对象(装配器)来装配对象之间的依赖关系 。

DI:常见的有 setter、构造器、接口注入,,但DI并没有说必须是这三种,其实我们只要注入依赖关系即可,如字段注入通过Spring注解也是可以的。



恩 没错。你把context的功能说的很细。

不过di的注入方式我只知道(接口,构造器,方法注入)三种。 字段注入我不理解什么意思。

有没有例子?


另外,刚才看了下。你这篇帖子 bean的作用域  http://jinnianshilongnian.iteye.com/blog/1415463

总结的很赞。。我有点觉得你是当老师在代课的。哈哈。描述方式,比较像老师。
0 请登录后投票
   发表时间:2012-04-01  
leonayx123 写道
引用

DI:用一个单独的对象(装配器)来装配对象之间的依赖关系 。

DI:常见的有 setter、构造器、接口注入,,但DI并没有说必须是这三种,其实我们只要注入依赖关系即可,如字段注入通过Spring注解也是可以的。



恩 没错。你把context的功能说的很细。

不过di的注入方式我只知道(接口,构造器,方法注入)三种。 字段注入我不理解什么意思。

有没有例子?


字段注入是我给起的,呵呵

@Autowired
private A a;
0 请登录后投票
论坛首页 Java企业应用版

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