锁定老帖子 主题:我对IoC/DI的理解
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-01
太理论了,缺少代码的说明
|
|
返回顶楼 | |
发表时间:2012-04-01
jyjava 写道 太理论了,缺少代码的说明
好吧,我的失误。。。 |
|
返回顶楼 | |
发表时间:2012-04-01
leonayx123 写道 wjm19870226 写道 LZ,你好。spring的两个特性就是IOC和AOP。被你这么一说,我就分不清IOC和DI什么区别和联系了?
AOP是切面。意思是,你要写一个服务。可以通过切面帮你形成一个代理。 在你的服务里方法执行前,返回值后,出现异常等情况里插入了一些操作。 怎么实现,其实是偷偷的继承了你的类,重写了你的方法。在调用时,调用的是这个隐藏的子类(代理类)。对你屏蔽了起来。 ioc是控制反转,意思是说,你要实例化一个对象,不是自己new一个。而是从工厂里给你分一个。实例化的过程教给了工厂 di是依赖注入。你可以把数据通过配置文件set到你的实例里(其实还有接口注入,构造器注入)。而不是通过 实例.setxxx()方法来给实例里的成员赋值。 AOP不是切面,是面向切面编程,要理解切面要先理解: 概念: 关注点:可以认为是所关注的任何东西,比如上边的支付组件; 关注点分离:将问题细化为单独部分,即可以理解为不可再分割的组件,如上边的日志组件和支付组件; 横切关注点:会在多个模块中出现,使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进,如日志组件横切于支付组件。 织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中从而完成需要的功能,因此需要织入,织入可能在编译期、加载期、运行期等进行。 切面就是横切关注点的模块化 自己总结的资料,看看对不? |
|
返回顶楼 | |
发表时间: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一些操作。 恩 去学习下你的分享~感谢分享。 |
|
返回顶楼 | |
发表时间: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注解也是可以的。 |
|
返回顶楼 | |
发表时间: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一些操作。 恩 去学习下你的分享~感谢分享。 反正是一起学习,对不对的说说自己的看法 |
|
返回顶楼 | |
发表时间:2012-04-01
jinnianshilongnian 写道 leonayx123 写道 wjm19870226 写道 LZ,你好。spring的两个特性就是IOC和AOP。被你这么一说,我就分不清IOC和DI什么区别和联系了?
AOP是切面。意思是,你要写一个服务。可以通过切面帮你形成一个代理。 在你的服务里方法执行前,返回值后,出现异常等情况里插入了一些操作。 怎么实现,其实是偷偷的继承了你的类,重写了你的方法。在调用时,调用的是这个隐藏的子类(代理类)。对你屏蔽了起来。 ioc是控制反转,意思是说,你要实例化一个对象,不是自己new一个。而是从工厂里给你分一个。实例化的过程教给了工厂 di是依赖注入。你可以把数据通过配置文件set到你的实例里(其实还有接口注入,构造器注入)。而不是通过 实例.setxxx()方法来给实例里的成员赋值。 AOP不是切面,是面向切面编程,要理解切面要先理解: 概念: 关注点:可以认为是所关注的任何东西,比如上边的支付组件; 关注点分离:将问题细化为单独部分,即可以理解为不可再分割的组件,如上边的日志组件和支付组件; 横切关注点:会在多个模块中出现,使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进,如日志组件横切于支付组件。 织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中从而完成需要的功能,因此需要织入,织入可能在编译期、加载期、运行期等进行。 切面就是横切关注点的模块化 自己总结的资料,看看对不? 你这些资料是那本书的?和我学习的资料有些不一样。不过我觉得你这本翻译的也许更合理一些。 “关注点”,这么理解或许比我的资料里 翻译成 “通知”更合理一些。你整理的知识很正确,很专业。 就是太抽象。 我刚才是想给那位同学举些更简单,更方便理解的例子。最近在带实习生有种感觉,这么讲理论他们听不懂。。得说的更。。。面向孩子一些。。 |
|
返回顶楼 | |
发表时间:2012-04-01
leonayx123 写道 jinnianshilongnian 写道 leonayx123 写道 wjm19870226 写道 LZ,你好。spring的两个特性就是IOC和AOP。被你这么一说,我就分不清IOC和DI什么区别和联系了?
AOP是切面。意思是,你要写一个服务。可以通过切面帮你形成一个代理。 在你的服务里方法执行前,返回值后,出现异常等情况里插入了一些操作。 怎么实现,其实是偷偷的继承了你的类,重写了你的方法。在调用时,调用的是这个隐藏的子类(代理类)。对你屏蔽了起来。 ioc是控制反转,意思是说,你要实例化一个对象,不是自己new一个。而是从工厂里给你分一个。实例化的过程教给了工厂 di是依赖注入。你可以把数据通过配置文件set到你的实例里(其实还有接口注入,构造器注入)。而不是通过 实例.setxxx()方法来给实例里的成员赋值。 AOP不是切面,是面向切面编程,要理解切面要先理解: 概念: 关注点:可以认为是所关注的任何东西,比如上边的支付组件; 关注点分离:将问题细化为单独部分,即可以理解为不可再分割的组件,如上边的日志组件和支付组件; 横切关注点:会在多个模块中出现,使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进,如日志组件横切于支付组件。 织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中从而完成需要的功能,因此需要织入,织入可能在编译期、加载期、运行期等进行。 切面就是横切关注点的模块化 自己总结的资料,看看对不? 你这些资料是那本书的?和我学习的资料有些不一样。不过我觉得你这本翻译的也许更合理一些。 “关注点”,这么理解或许比我的资料里 翻译成 “通知”更合理一些。你整理的知识很正确,很专业。 就是太抽象。 我刚才是想给那位同学举些更简单,更方便理解的例子。最近在带实习生有种感觉,这么讲理论他们听不懂。。得说的更。。。面向孩子一些。。 这是我自己总结的 。 哈哈哈,对,初学者最好给他们看图 |
|
返回顶楼 | |
发表时间:2012-04-01
最后修改:2012-04-01
引用 DI:用一个单独的对象(装配器)来装配对象之间的依赖关系 。 DI:常见的有 setter、构造器、接口注入,,但DI并没有说必须是这三种,其实我们只要注入依赖关系即可,如字段注入通过Spring注解也是可以的。 恩 没错。你把context的功能说的很细。 不过di的注入方式我只知道(接口,构造器,方法注入)三种。 字段注入我不理解什么意思。 有没有例子? 另外,刚才看了下。你这篇帖子 bean的作用域 http://jinnianshilongnian.iteye.com/blog/1415463 总结的很赞。。我有点觉得你是当老师在代课的。哈哈。描述方式,比较像老师。 |
|
返回顶楼 | |
发表时间:2012-04-01
leonayx123 写道 引用 DI:用一个单独的对象(装配器)来装配对象之间的依赖关系 。 DI:常见的有 setter、构造器、接口注入,,但DI并没有说必须是这三种,其实我们只要注入依赖关系即可,如字段注入通过Spring注解也是可以的。 恩 没错。你把context的功能说的很细。 不过di的注入方式我只知道(接口,构造器,方法注入)三种。 字段注入我不理解什么意思。 有没有例子? 字段注入是我给起的,呵呵 @Autowired private A a; |
|
返回顶楼 | |