|
Matrix java高级论坛之IoC与Dependnecy Injection<BR><PRE>Chris-(197750- 专题:IoC 与 Dependnecy Injection 主讲:echoaholic 7月19日- Chris-(197750- 现在开始. Chris-(197750- 欢迎我们得echoaholic 10086402- 嘿嘿,好:) 324002862- [rose] 6947930- [v] Chris-(197750- 鼓掌!! 80769563- 先介绍一下!! Chris-(197750- 开始吧! Chris-(197750- 大家安静! 80769563- [;x] 10086402- 那我开始了 10086402- IoC是Inversion of Control的缩写,是一种设计原则 10086402- 也是很多framework的基本设计思想 10086402- 今天我们从一个简单的例子开始,介绍ioc和framework,然后是ioc在配制管理方面的一个 应用,也就是dependency injection 6947930- 建议主讲用颜色区分 10086402- 可以吗? Chris-(197750- echoaholic,用红色吧,主持人绿色,其他人黑色. 20535737- [rose] 10086402- sigh Chris-(197750- ok,继续 10086402- 好的,现在让我们看一个最简单的frameworks的例子 10086402- 我们都知道framework都是针对某一个具体领域应用的 10086402- 那么最简的一个framework的例子就是template method pattern 10086402- abstract class PriceService { - { - * getAmount(-; } -; -; } 10086402- 这里给出一个简单的计费服务 10086402- 其中需要两个方法,单价和数量 10086402- 那么针对计费,这一个类就是一个最简单,最丑陋的framework 10086402- 任何具体的计费业务只需扩展这个class然后提供具体的method实现就可以了 10086402- 这里就有IoC 10086402- method getUnitPrice和getAmount就是IoC Method 80769563- 我有个问题。。。:) 10086402- 也就是反转控制函数 10086402- 说:) 2274459- 讲一个阶段再提问题啦 10086402- 那我继续了:) 20535737- whats the meaning of IOC full spelling ? 24889356- 倒~ 10086402- Inversion of Control 80769563- 好吧!我一会儿再说。。 2274459- 2004-07-19 19:51:33- echoaholic(10086402- IoC是Inversion of Control的缩写,是一种设计原则 2004-07-19 19:51:54- echoaholic(10086402- 也是很多framework的基本设计思想 2004-07-19 19:53:17- echoaholic(10086402- 今天我们从一个简单的例子开始,介绍ioc和framework,然后是ioc在配制管理方面的一个 应用,也就是dependency injection 20535737- sorry 2274459- 1、一个阶段完了以后再提问题 2、提问题前先看看前面的 13819651- 继续 65267063- 大家安静点,别打断老师的思路。 10086402- IoC有一个另外的名字,叫好莱坞原则 echoaholic- 20:02:06 也就是don't call us we call u echoaholic- 20:02:36 我们提供的这两个method,并不直接去调用framework的代码,而是等待framework来调用它 异想者- 20:03:12 echoaholic- 20:03:37 那么在一点上,控制被反转了,也就是method并不自主的控制他的调用点,而是等到外层 的framework来使用它的实现 echoaholic- 20:04:16 这也就是IoC最基本的一个应用,template method pattern echoaholic- 20:04:50 好,这是一个段落,下面我将把这个framework扩展 wuyu- 20:04:58 当我需要调用的时候,我再来看该找谁,然后再找这个人做事情? echoaholic- 20:05:03 之前大家可以提一些问题 异想者- 20:05:31 在设计模式中还有什么用到了ioc吗 echoaholic- 20:05:38 to wuyu 这里的意思是说,我们实现的代码是等待别人使用的 孤魂野鬼- 20:06:03 ioc==dependency injection ? &Limy- 20:06:07 说到ioc,也就是控制反转,我们需要先明晰控制什么?哪些属于控制?有些什么种类?这样, 你在后面讲起来,别人会比较清晰。 echoaholic- 20:06:23 to 异想 template method最明显 echoaholic- 20:06:38 to 孤魂野鬼 ioc != dependency injection 异想者- 20:06:40 谢谢老师 &Limy- 20:06:55 控制有很多种,最简单的就是方法的调用,方法的实现。。。。ioc!=di crane- 20:07:05 模版模式 和IOC的区别是是么 crane- 20:07:11 是什么 echoaholic- 20:07:22 IoC是一个大的设计原则,注意,是原则,而不是pattern echoaholic- 20:07:38 to crane,这个后面会说:) 异想者- 20:07:45 依赖倒转就是ioc吗 crane- 20:07:47 :) ~~酉告~~- 20:08:02 dependency injection 只是 ioc 其中一种Pattern 异想者- 20:08:30 我记得在面向对象的原则中提到了它,但当时我不知道是ioc,呵呵 echoaholic- 20:08:39 to &Limy 我的例子是业务反转的例子,后面会扩展,我们会发现,只要有合适的framework,大部分 东西都可以反转 echoaholic- 20:09:09 好,我下面继续了 ╃(Chris-- 20:09:17 好的,echoaholic继续 ╃(Chris-- 20:09:40 大家安静,等下一个环节结束再发问.echoaholic结束的时候给个提示. echoaholic- 20:09:49 我们来再看一下这个代码 abstract class PriceService { - { - * getAmount(-; } -; -; } echoaholic- 20:10:36 由于是最小的framework,我们使用了继承,使得结构有些混乱,那么我们来看一下使 用interface的情况 echoaholic- 20:12:21 final class PriceService { IUnitPriceProvider upp; IAmountProvider ap; - { - * 阿ap.getAmount(-; } } interface IUnitPriceProvider { -; } interface IAmountProvider { -; } echoaholic- 20:12:57 这个就是一个较为复杂一些的framework,把template method用callback interface代替 echoaholic- 20:14:05 当我们有两个组件 RMIUnitPriceProvider和RMIAmountProvider的时候 echoaholic- 20:14:25 我们可以让priceService去调用这两个组件 echoaholic- 20:14:57 同样这两个组件并不控制自己的调用,而是交给framework去完成 echoaholic- 20:15:17 这样这两个组件也就成了IoC component echoaholic- 20:15:58 同样,我们可以提供WebServiceUnitPriceProvider和WebServiceAmountProvider 孤魂野鬼- 20:16:44 怎么感觉像EAI,框架负责组装东西,东西的具体实现就靠个个厂家了 echoaholic- 20:17:21 他们同样是IoC Component,那么最为定义业务的PriceService可以选择去使用哪一个具体 的实现,而做为实现的具体组件,并不负责 echoaholic- 20:17:39 最为定义业务-〉作为..... 冰云- 20:18:57 ? echoaholic- 20:19:12 对于PriceService而言,只需要实现IUnitPriceProvider和IAmountProvider的组件,这就 是IoC另外一个名字DIP Dependency Inversion Principle 异想者- 20:20:02 也就是针对抽象编程,是吧,老师 echoaholic- 20:20:10 而做为实现的具体组件,并不负责 这句话有点古怪,大家能意会我就不说了:) echoaholic- 20:20:47 to 异想 对,这也就是为什么说IoC是一个设计原则而不是pattern的原因 echoaholic- 20:21:21 对组件而言,它是调用控制被反转,对framework而言,依赖倒转 异想者- 20:21:24 这个例子与上一个例子的最大区别就是具体的类变成了抽象的接口,看出来还是不难,您说 得真好 echoaholic- 20:22:19 这就使最初的IoC的形式,在组织一组framework的时候,业务调用被反转 wuyu- 20:22:25 可以提问了吗?(感觉好象是到了一个阶段了) echoaholic- 20:22:35 可以了:) wuyu- 20:22:40 对于PriceService的例子,如果采用factory的方法 用一个xml配置文件描述IUnitPriceProvider和具体的实现,比如WebServicesPriceProvider 的关系,class的修改 final class PriceService { -; 如果从解耦的角度出法,两种方法都可以达到同样的目的。 那么,相对来说,这里使用IOC有什么好处呢? magicgod- 20:23:22 美国精神,simple & free echoaholic- 20:23:33 嘿嘿,你这个是dependency management IoC,而我主要说的是业务调用反转 echoaholic- 20:24:18 也就是对于RMIUnitPriceProvider而言,对他的业务调用是反转的:) echoaholic- 20:24:29 DM IoC还没有说到:) wuyu- 20:25:11 我的意思是,使用IOC也好,使用factory也好,或是别的方式,都应该有一个目的,如果 是为了解耦的话,看不出来ioc和我举的例子之间有多大的区别啊?而且我要使用Ioc,我 还得加上一个IOC的framework wuyu- 20:26:13 从现在讲的情况来看,使用IOC能够达到松耦合的目的,除了这个好处以外,IOC区别于别 的解耦手段,还有什么优点呢? echoaholic- 20:26:16 呵呵,其实你说的IoC是dependency management &Limy- 20:26:28 对于组件来说,不需要ioc的framework。 echoaholic- 20:26:46 而我说的,是在framework里使用的ioc 冰云- 20:26:57 举个例子来说吧 echoaholic- 20:27:00 比如swing 冰云- 20:27:06 我来说 异想者- 20:27:11 IOC不是一个面对对象的思想吗,它们之间应该是使用和思想的关系吧 冰云- 20:27:15 比如,还是传统的Boy和Girl nemo- 20:27:25 echoaholic- 20:27:32 业务是kiss 冰云- 20:27:36 Boy和Girl之间有关系,但是并不是Boy可以有个GirlFactory.newInstance 异想者- 20:27:37 &Limy- 20:27:38 还是冰云的那个例子,呵呵。。 冰云- 20:27:50 而是说,可以有Girl给Boy来用 冰云- 20:28:06 换一种情况 冰云- 20:28:14 Boy有Head,Arm, Leg echoaholic- 20:28:18 你。。。。。你。。。。你把我的例子抢了 冰云- 20:28:23 …… wuyu- 20:28:25 -的? 冰云- 20:28:26 这是我的例子! 异想者- 20:28:29 呵呵 &Limy- 20:28:38 冰云- 20:28:43 boy对head,arm等负责全部生命周期 冰云- 20:28:51 这时候 wuyu- 20:28:55 如果使用factory的话,至少要关心一下谁来当的媒人? 共筑佳话- 20:28:57 继续 冰云- 20:29:04 可以让boy有个factory来创建head,arm, 冰云- 20:29:13 当然,直接new也无不可 echoaholic- 20:29:35 哎~~~~怎么直接讨论到了DM IoC 冰云- 20:29:40 …… 冰云- 20:29:46 你继续 异想者- 20:29:52 我想还是让echoaholic继续 共筑佳话- 20:30:05 @寻找 wuyu- 20:30:09 呵呵,等最后估计我就清晰了,先不打岔:) 冰云- 20:30:22 继续继续 异想者- 20:30:23 主持出场呀 孤魂野鬼- 20:30:26 主持人,方丈呢? echoaholic- 20:30:31 我的意思是业务调用IoC,比如观察者模式 echoaholic- 20:31:04 MessageListener和MessagePublisher echoaholic- 20:31:45 这个里面的业务就是publisher把message发布到listener echoaholic- 20:32:11 那么这个里面,listener并不主动去拿message echoaholic- 20:32:26 而是等待publisher对他调用 echoaholic- 20:32:43 这就是业务调用IoC echoaholic- 20:33:21 也就是IoC的最初形式,把调用权反转,也是framework里用得最多的形式 &Limy- 20:33:30 其实我觉得还是不要用ioc,用依赖反转比较好, 其实,现在普遍提出的ioc实际上是echo所指的dm ioc 共筑佳话- 20:33:41 异想者- 20:33:53 也就是通过侦听器的使用,使原来客户端调用的方向反向了 echoaholic- 20:34:11 因为ioc是因为dm ioc才有火起来的一个词 echoaholic- 20:34:33 所以一说ioc,大家都觉得是dm ioc echoaholic- 20:35:33 现在我要澄清的一个问题就是ioc本来是什么 &Limy- 20:35:33 对,所以还是在之前的模式应用里面,用依赖反转比较好。。。而讲到dm ioc在使用ioc来 说,最后总结一下依赖反转就是另一种ioc,这样,你和冰云,就不用争论了:)你继续 冰云- 20:35:58 我没争论阿 &Limy- 20:36:04 所以我一开始就强调一点,什么是ioc里面的c~~~ 共筑佳话- 20:36:08 echoaholic- 20:36:13 按照我的理解,ioc就是一种设计原则 echoaholic- 20:36:27 上面是我对这个看法的一个阐述 &Limy- 20:36:55 控制是什么?哪些属于控制,这样大家会比较清晰,好了,你继续,我不打岔了。:) echoaholic- 20:37:06 如果大家没有疑异,我们可以开始对一些特定ioc的讨论:) 异想者- 20:37:25 我还想问一下 异想者- 20:37:29 AOP是什么 &Limy- 20:37:45 aop在另外一个群里面会讨论到:) echoaholic- 20:38:03 to &Limy 说得对,我忘记了这一点,上面讲得内容是对业务调用的反转 echoaholic- 20:38:14 应该以开始就说出来:) &Limy- 20:38:28 呵呵:)所以一开始我就给你提问了:) &Limy- 20:38:48 其实是在提醒你一下啊 :)这样就避免刚才对dm的争论了:) &Limy- 20:39:23 你继续吧~ 异想者- 20:39:26 谢谢,我找以了,Aspect Oriented Programming的缩写,意思是面向方面编程 crane- 20:39:36 好拉,继续关注。。。 异想者- 20:39:50 echoaholic- 20:39:54 好,如果没有疑议我就继续了 孤魂野鬼- 20:40:04 概念性的东西。。。。。自己查 javaduke- 20:40:05 继续! echoaholic- 20:41:02 现在我们来看一下特定领域内的ioc dependency management IoC configuration management IoC lifecycle IoC 等等 crane- 20:41:10 echoaholic- 20:41:25 首先是dm ioc echoaholic- 20:42:13 也就是从去年5,6月份起很火的pico和spring提供的一种ioc方式 echoaholic- 20:42:53 好,我们看一个例子,还是冰云的那个例子 冰云- 20:43:19 嘿嘿 echoaholic- 20:45:19 class Something { "icecloud"-;//嘿嘿寒你一下 "????"-; - { girl-; girl-; girl-;//嘿嘿,再寒你一个 } } crane- 20:45:58 冰云- 20:46:07 故意的 异想者- 20:46:08 echoaholic- 20:46:26 对于这个Something Service,在业务上他是IoC的 dragonlan- 20:46:31 ^_^ echoaholic- 20:47:09 因为在doSomething里他调用了具体的ioc component,IBoy和IGirl 孤魂野鬼- 20:47:41 怎么感觉ioc无处不在。。。 echoaholic- 20:48:21 同时,这个Something Service局部上也是dip的,因为在doSomething method里没有掉用具 体的实现类,而是使用接口IBoy和IGirl进行的调用 echoaholic- 20:49:09 但是对于整个Something Service而言,它并不是dip的,因为它里面用到new ChineseBoy和 new ChineseGirl echoaholic- 20:49:49 与具体的实现类发生了依赖,于是就不是dip的了 异想者- 20:50:04 这就是不足的地方啦,呵呵 echoaholic- 20:50:26 那么对于new ChineseBoy和new ChineseGirl这两行代码实际上是什么内容呢? echoaholic- 20:50:57 这两行代码可以称作dependency assembling code echoaholic- 20:51:29 因为我们知道,对于一个component而言,在使用它之前,应该保证它是装配完整的 echoaholic- 20:52:05 比如这个something,如果没有boy,那么就不能doSomething,如果没有girl,那么........ echoaholic- 20:52:18 boy就只能yy了 冰云- 20:52:22 抽象了抽象了 异想者- 20:52:23 char- 20:52:25 依赖倒转原则 dip Dependence Inversion 这些很多跟模式差不多。 echoaholic- 20:52:46 所以一个组件是需要装配的 echoaholic- 20:53:05 现在的情况是,组件自己负责自己的装配 echoaholic- 20:53:33 那么,这里我们可以使用IoC,也就是组件不负责自己的装配 echoaholic- 20:54:02 而把装配的工作交给一个assemble framework ~~酉告~~- 20:54:08 class Something { IBoy boy = null IGirl girl = - { girl-; girl-; girl-;//嘿嘿,再寒你一个 } } "icecloud"-;//嘿嘿寒你一下 ~~酉告~~- 20:54:21 sorry 异想者- 20:55:14 好了,知道了,只是一个new没什么啦F91672,你真认真 echoaholic- 20:55:40 class Something { IBoy boy; IGirl girl; IBoy boy, IGirl girl- { this.boy = boy; this.girl = girl; } - { girl-; girl-; girl-; } } 孤魂野鬼- 20:56:29 参数化:) 郁也风- 20:56:31 这是type1? echoaholic- 20:56:36 new ChineseBoy("icecloud"-, new ChineseGirl("???"--; 来完成对组件的装配 ~~酉告~~- 20:56:38 constructor 郁也风- 20:56:43 差点没赶上啊:( echoaholic- 20:56:43 type3 郁也风- 20:56:59 哦,顺序高错了:) 异想者- 20:57:11 ~~酉告~~- 20:57:19 new ChineseBoy("icecloud"-, new ChineseGirl("如花"--;//如何。。。。:D 异想者- 20:57:35 F57C7B echoaholic- 20:57:43 也就是说我们把装配和配置管理,倒转到外面的assemble framework里了 冰云- 20:57:50 crane- 20:57:53 晕 郁也风- 20:58:07 异想者- 20:57:35 F57C7B echoaholic- 20:58:14 这就是pico和spring的设计原理 农民 - Javen- 20:58:17 请大家少点废话 </PRE><PRE></PRE> <P><BR clear=all> <HR align=left color=#999999 noShade SIZE=2 width=400>
<P></P><PRE>echoaholic- 20:39:54 好,如果没有疑议我就继续了 孤魂野鬼- 20:40:04 概念性的东西。。。。。自己查 javaduke- 20:40:05 继续! echoaholic- 20:41:02 现在我们来看一下特定领域内的ioc dependency management IoC configuration management IoC lifecycle IoC 等等 crane- 20:41:10 echoaholic- 20:41:25 首先是dm ioc echoaholic- 20:42:13 也就是从去年5,6月份起很火的pico和spring提供的一种ioc方式 echoaholic- 20:42:53 好,我们看一个例子,还是冰云的那个例子 冰云- 20:43:19 嘿嘿 echoaholic- 20:45:19 class Something { "icecloud"-;//嘿嘿寒你一下 "????"-; - { girl-; girl-; girl-;//嘿嘿,再寒你一个 } } crane- 20:45:58 冰云- 20:46:07 故意的 异想者- 20:46:08 echoaholic- 20:46:26 对于这个Something Service,在业务上他是IoC的 dragonlan- 20:46:31 ^_^ echoaholic- 20:47:09 因为在doSomething里他调用了具体的ioc component,IBoy和IGirl 孤魂野鬼- 20:47:41 怎么感觉ioc无处不在。。。 echoaholic- 20:48:21 同时,这个Something Service局部上也是dip的,因为在doSomething method里没有掉用具 体的实现类,而是使用接口IBoy和IGirl进行的调用 echoaholic- 20:49:09 但是对于整个Something Service而言,它并不是dip的,因为它里面用到new ChineseBoy和 new ChineseGirl echoaholic- 20:49:49 与具体的实现类发生了依赖,于是就不是dip的了 异想者- 20:50:04 这就是不足的地方啦,呵呵 echoaholic- 20:50:26 那么对于new ChineseBoy和new ChineseGirl这两行代码实际上是什么内容呢? echoaholic- 20:50:57 这两行代码可以称作dependency assembling code echoaholic- 20:51:29 因为我们知道,对于一个component而言,在使用它之前,应该保证它是装配完整的 echoaholic- 20:52:05 比如这个something,如果没有boy,那么就不能doSomething,如果没有girl,那么........ echoaholic- 20:52:18 boy就只能yy了 冰云- 20:52:22 抽象了抽象了 异想者- 20:52:23 char- 20:52:25 依赖倒转原则 dip Dependence Inversion 这些很多跟模式差不多。 echoaholic- 20:52:46 所以一个组件是需要装配的 echoaholic- 20:53:05 现在的情况是,组件自己负责自己的装配 echoaholic- 20:53:33 那么,这里我们可以使用IoC,也就是组件不负责自己的装配 echoaholic- 20:54:02 而把装配的工作交给一个assemble framework ~~酉告~~- 20:54:08 class Something { IBoy boy = null IGirl girl = - { girl-; girl-; girl-;//嘿嘿,再寒你一个 } } "icecloud"-;//嘿嘿寒你一下 ~~酉告~~- 20:54:21 sorry 异想者- 20:55:14 好了,知道了,只是一个new没什么啦F91672,你真认真 echoaholic- 20:55:40 class Something { IBoy boy; IGirl girl; IBoy boy, IGirl girl- { this.boy = boy; this.girl = girl; } - { girl-; girl-; girl-; } } 孤魂野鬼- 20:56:29 参数化:) 郁也风- 20:56:31 这是type1? echoaholic- 20:56:36 new ChineseBoy("icecloud"-, new ChineseGirl("???"--; 来完成对组件的装配 ~~酉告~~- 20:56:38 constructor 郁也风- 20:56:43 差点没赶上啊:( echoaholic- 20:56:43 type3 郁也风- 20:56:59 哦,顺序高错了:) 异想者- 20:57:11 ~~酉告~~- 20:57:19 new ChineseBoy("icecloud"-, new ChineseGirl("如花"--;//如何。。。。:D 异想者- 20:57:35 F57C7B echoaholic- 20:57:43 也就是说我们把装配和配置管理,倒转到外面的assemble framework里了 冰云- 20:57:50 crane- 20:57:53 晕 郁也风- 20:58:07 异想者- 20:57:35 F57C7B echoaholic- 20:58:14 这就是pico和spring的设计原理 农民 - Javen- 20:58:17 请大家少点废话 echoaholic- 20:58:41 实际上,pico和spring就是那个assemble framework echoaholic- 20:59:13 echoaholic- 20:59:13 他的业务就是装配,他反转的就是装配控制 echoaholic- 21:00:14 当然,没有dm IoC container之前,我们使用Factory以及其它的创建模式,目的也是一样的 echoaholic- 21:00:49 把创建一致组件的工作的交给factory 异想者- 21:00:49 实际上,pico和spring就是那个assemble framework 可以说个例子吗 echoaholic- 21:01:05 例子后面就有了:) 异想者- 21:01:10 echoaholic- 21:01:55 对于一个具体的factory而言,我们可以认为它就是一个针对特定组件的最小的assemble framework echoaholic- 21:02:26 那么使用factory和pico等container有什么区别呢? echoaholic- 21:02:58 factory是针对特定的组件的 echoaholic- 21:03:26 而pico,spring等则定义了一套通用的方法 echoaholic- 21:03:36 也就是dependency injection echoaholic- 21:04:24 因此我们可以认为,depedency injection是IoC在dependency manage或assemble领域内的 一个特定应用pattern 异想者- 21:04:53 echoaholic- 21:05:15 下面我们来看一下具体的dependency injection这个模式,之前大家可以提问 孤魂野鬼- 21:06:09 刚才有人说:di是ioc的一种?这样理解ok? 孤魂野鬼- 21:06:20 ioc是个原则,di是个模式 echoaholic- 21:06:20 ok echoaholic- 21:06:35 但不太严禁 echoaholic- 21:07:22 di是模式,它的思想是ioc,template method也是pattern,它的思想还是ioc echoaholic- 21:08:18 不过是不同领域的ioc而已 异想者- 21:08:37 它们的思想 ~~酉告~~- 21:08:45 type1:interface injection type2:setter injection type3:constructor injection type1比较难懂。通过实现特定接口完成“依赖注入”? 异想者- 21:08:56 归根到底都是关注点分离 echoaholic- 21:09:04 这个马上就会说到 echoaholic- 21:09:15 异想者- 21:08:56 归根到底都是关注点分离 以及职责单一 异想者- 21:09:25 谢谢 共筑佳话- 21:09:41 职责单一 echoaholic- 21:10:12 没问题我们继续了:) javaduke- 21:11:06 echoaholic- 21:11:16 di有这样几个类型 ~~酉告~~- 21:08:45 type1:interface injection type2:setter injection type3:constructor injection echoaholic- 21:11:27 我们先看interface injection echoaholic- 21:11:35 也就是type1 echoaholic- 21:11:51 其实type1是dm ioc最自然的发展 echoaholic- 21:12:54 我们开始的时候说了,ioc最初形式,是业务调用控制反转 echoaholic- 21:13:48 type1 dm ioc是把dependency injection作为一个业务来看待的 echoaholic- 21:14:04 比如还是例子 echoaholic- 21:15:29 在interface injection里,需要这样一个接口 interface IBoyGirlAware { IBoy boy-; IGirl girl-; } echoaholic- 21:16:01 把介绍男孩和介绍女孩作为业务的一部分来看待 echoaholic- 21:17:30 然后Something implements IBoyGirlAware new ChineseBoy("icecloud"--; new ChineseGirl("???"--; echoaholic- 21:18:02 具体的装配代码就是这样的,完全按照dip,来做 echoaholic- 21:18:26 也就是业务调用反转在dm领域的自然延展 echoaholic- 21:19:37 典型的框架代表是avalon echoaholic- 21:21:12 虽然type1在感念延展上很自然,但是这也带来了问题,对于业务interface,这样没有什么 问题,但是如果是对于基础服务,比如log等等,需要实现自己的Loggable interface echoaholic- 21:21:44 那么在移植的时候,这些技术性接口就会带来很大的问题 echoaholic- 21:22:47 因为使用什么样的log是组件的自己的事,是实现级别的事,一旦暴露在接口上,就是接口行为了 echoaholic- 21:22:55 对外性质的定义 echoaholic- 21:23:18 无论从设计思路和移植上都存在较大的困难 echoaholic- 21:23:27 哎~~~病句 echoaholic- 21:23:36 设计思路存在很大问题 echoaholic- 21:24:37 但如果你的组件要injection的dependency都是业务级的,那么使用interface injection也 是不错的方案 echoaholic- 21:26:06 avalon本意是设计一个纯cbd framework,在cbd里,component都是业务上的,不会实现任何 技术接口,那么avalon使用这种方式也就是可以理解甚至是指得称道的了 农民 - Javen- 21:26:10 现在好像说的是: 像你说的如 log exception 等公共服务,比如合适用 AOP echoaholic- 21:26:22 对 echoaholic- 21:27:39 然后avalon并没有在container层对技术做一个很好的实现,于是他的组件不得以还是要实现 技术接口,avalon也试图规范这些接口,但最终的结果是把组件绑在了avalon上,给移植带 来了更大的困难 echoaholic- 21:28:18 所以,一般而言会认识avalon的type1比较失败,同时不够轻量化,属于次轻量级dm ioc container echoaholic- 21:28:42 实际type1还是不错的,只不过avalon的实现有问题 crane- 21:28:59 异想者- 21:29:05 提问 echoaholic- 21:29:36 好,正是一个段落 &Limy- 21:29:43 刚才出去了一下,讲到哪里了?ioc type? echoaholic- 21:29:52 异想者- 21:30:02 我推测是不是因为它在接口的组装时没有从容器配置中读取 echoaholic- 21:30:09 &Limy给你两分钟review echoaholic- 21:30:40 to 异想者 这个还是读取了的 &Limy- 21:30:54 在讲type 1 2 3 ...martin对其作了从新定义 异想者- 21:30:58 如果用工厂方法,通过读取配置信息的方法,那为什么还是有问题呢 echoaholic- 21:31:45 嘿嘿,工厂是特殊的dm ioc容器,dm ioc容器是一般化的工厂 echoaholic- 21:32:06 &Limy- 21:30:54 在讲type 1 2 3 ...martin对其作了从新定义 interface injection太长,type1短....... 农民 - Javen- 21:32:19 avalon 的问题所在是不是:他的公共服务也是用的 interface injection 。那时还没有 AOP 而现在 JBoss 好像大量用了 AOP ,主要是不是也是公共服务上? echoaholic- 21:32:59 对,在服务端使用aop增强技术关注,是实现容器的好办法 magicgod- 21:33:03 avalon的问题一在太重,二在较封闭不自然 &Limy- 21:33:07 可是interface injection说出来就让人知道他是如何注入的,而不想type3那样。。。挺难分。 异想者- 21:33:17 噢,也就是这样的话,它所有的插件都必须实现工厂所要求的一个特殊的接口 echoaholic- 21:33:33 对,avalon就是这个思路 异想者- 21:33:48 谢谢 echoaholic- 21:34:17 to magicgod 我倒是认为从设计上讲,avalon最自然,最与实现语言无关 echoaholic- 21:34:29 因为si和ci需要反射 magicgod- 21:34:43 实现自有接口就有点不自然了 echoaholic- 21:34:51 其中si尤其是参照javabean 孤魂野鬼- 21:35:08 si ,ci? magicgod- 21:35:23 尽量把烦恼让给框架之类 &Limy- 21:35:27 就是两种注入 echoaholic- 21:35:27 magicgod- 21:34:43 实现自有接口就有点不自然了 所以说,如果是业务接口就自然,技术接口就不自然 ~~酉告~~- 21:35:30 setter injection constructor injection &Limy- 21:35:54 所以说,如果是业务接口就自然,技术接口就不自然 统一 magicgod- 21:36:00 应该给业务实现者提供一个非常好的氛围 &Limy- 21:36:00 所以说,如果是业务接口就自然,技术接口就不自然 同意 异想者- 21:36:14 echoaholic- 21:36:27 更多使用容器技术-,就很好 &Limy- 21:36:28 不应该依赖于单一的注入方法,各取所长。 异想者- 21:37:04 你认为如果不换体系架构,可以改吗 异想者- 21:37:45 echoaholic- 21:36:27 更多使用容器技术-,就很好 提问:你认为如果不换体系架构,可以改吗 echoaholic- 21:37:53 可以 异想者- 21:38:05 ~~酉告~~- 21:38:08 因为层层代理和反射的关系,现在的程序越来越难懂了。。。。。 echoaholic- 21:38:10 因为avalon的容器实现是透明的 echoaholic- 21:38:36 组件交互是通过context也就是naming service实现的 echoaholic- 21:38:57 于是他的架构延展性就很强 echoaholic- 21:39:11 给了他很多使用容器的机会 &Limy- 21:39:21 因为层层代理和反射的关系,现在的程序越来越难懂了。。。。。 代理与反射是框架替自己做的,做业务实现大部分不需要自己使用它,除非你自己写个framework echoaholic- 21:39:48 但是问题是,如果更多的使用容器,那么avalon就会越来越重 echoaholic- 21:40:18 当然,ioc contaienr也不一定必须是lightweight container echoaholic- 21:40:31 不过pico和spring都非常轻 异想者- 21:40:43 你是说它可以使用抽象工厂方法来解决吗 ~~酉告~~- 21:40:44 现在很多情况上是framework上再加另一个framework。。。。。。 echoaholic- 21:41:02 给大家的印象就是dm ioc container都很轻,也都该很轻 孤魂野鬼- 21:41:25 轻装上阵,我喜欢 异想者- 21:41:25 异想者- 21:40:43 你是说它可以使用抽象工厂方法来解决吗 echoaholic- 21:41:51 嘿嘿,对于给定组件群可以 echoaholic- 21:41:58 但不够通用 echoaholic- 21:42:34 dm ioc container给出的是一个通用的方案 异想者- 21:42:43 呵呵,谢谢,是我不了解avalon,我不问了,您继续吧 &Limy- 21:43:01 ioc之所以很受欢迎,是在于它能够使得container变轻,比如spring,nanning...所以, ioc需要轻啊。:) echoaholic- 21:43:44 嘿嘿,如果是完全cbd,就很难很轻,只能比较轻 异想者- 21:44:03 呵呵, 时间有限 echoaholic- 21:44:07 比如eclipse runtime那个container 异想者- 21:44:26 eclipse runtime那个container 农民 - Javen- 21:44:37 cbd 具体指什么? </PRE> <P><BR clear=all> </P> <P> <HR align=left color=#999999 noShade SIZE=2 width=400> echoaholic- 21:44:44<BR> 嘿嘿,好,下面是setter injection,也就是以前的type2 <BR>echoaholic- 21:44:53<BR> component-based development <BR>异想者- 21:45:07<BR> 对不起,eclipse runtime那个container,请一定说说,什么时候都可以 <BR>echoaholic- 21:45:19<BR> 好,下次:) <BR>异想者- 21:45:29<BR> ,好的 <BR>农民 - Javen- 21:45:38<BR> 欢迎 echo 作为下一个专题吧! eclipse 有太多可以研究的东西! <BR>echoaholic- 21:45:52<BR> setter injection是spring比较推荐的一种方案 <BR>异想者- 21:46:02<BR> ,好,明天,呵呵 <BR>echoaholic- 21:46:25<BR> spring的思路是以javaBean作为最小的组件实现 <BR>echoaholic- 21:46:34<BR>异想者- 21:46:02<BR> ,好,明天,呵呵 <BR> <BR> <BR>异想者- 21:46:42<BR> 6BBE90 <BR>异想者- 21:46:50<BR> 我知道你有事的 <BR>echoaholic- 21:47:01<BR> 于是,在整个spring的设计里都比较强调bean <BR>echoaholic- 21:47:31<BR> bean对外有property,event,method <BR>echoaholic- 21:48:01<BR> dependency实际上就是oo里的关联(或者聚合,这个可能更贴切) <BR>echoaholic- 21:48:21<BR> 于是property自然是最好的表现关联的场所 <BR>echoaholic- 21:48:59<BR> 于是spring选择了property作为dependency injection的场所 <BR>echoaholic- 21:49:41<BR> 自然也就是property的asseccer method里的setter方法 <BR>echoaholic- 21:50:00<BR> 说一句题外的,这个思路发展一下就使field injection <BR>异想者- 21:50:31<BR> field injection不了解 <BR>异想者- 21:50:39<BR> <BR>~~酉告~~- 21:50:47<BR> 有区别吗? <BR>echoaholic- 21:51:08<BR> www.cnblogs.com/raimundo <BR>echoaholic- 21:51:26<BR> 嘿嘿,借机推销一下Blog:) <BR>10086402-<BR> 有一篇关于field injection的,我们继续看setter <BR> <BR>10086402-<BR> 那么么个例子就变成了<BR> class Something {<BR>IBoy boy-{}<BR>IGirl girl-{}<BR> }<BR> 具体实现不写了 <BR> <BR>10086402-<BR> 然后可以在spring里指定,Something的boy property和girl property为一些具体的component <BR> <BR>10086402-<BR> 冰云,补充一个xml吧 <BR> <BR>10086402-<BR> 我都好久不用spring了 <BR> <BR>6947930-<BR>IBoy boy-{}<BR> 这个方法有实现业务的程序员实现么 <BR> <BR>10086402-<BR> 对 <BR> <BR>6947930-<BR> 这个方法由实现业务的程序员实现么 <BR> <BR>10086402-<BR> 就像一个一般的javabean一样 <BR> <BR>6947930-<BR> 哦,那会很乱套的 <BR> <BR>10086402-<BR> 对 <BR> <BR>10086402-<BR> 不会 <BR> <BR>6947930-<BR> 有例子么 <BR> <BR>324002862-<BR> 呵呵 <BR> <BR>10086402-<BR> 我还是给完全吧 <BR> <BR>324002862-<BR> 组件由外部提供,组装的步骤由内部实现,不会乱的 <BR> <BR>10086402-<BR> class Something {<BR> IBoy boy;<BR> IGirl girl;<BR>IBoy boy- {<BR> this.boy = boy;<BR> }<BR>IGirl girl-{<BR> this.girl = girl;<BR> }<BR>- {<BR> }<BR> } <BR>echoaholic- 21:57:13<BR>BeanFactory-来装配 <BR>echoaholic- 21:57:21<BR> 然后我们这么用 <BR>crane- 21:58:08<BR> 业务程序员写这行代码么 this.girl = girl; <BR>echoaholic- 21:58:19<BR>-;<BR> 。。。。<BR>"Something"-;<BR>-; <BR>异想者- 21:58:41<BR> 但这样,组件还是要符合接口的要求,还是特定的类呀 <BR>echoaholic- 21:58:45<BR> 从factory get出来的时候已经装配好了 <BR>crane- 21:58:56<BR> 哦 <BR>echoaholic- 21:59:01<BR>crane- 21:58:08<BR> 业务程序员写这行代码么 this.girl = girl;<BR> <BR> 可以用ide声称 <BR>echoaholic- 21:59:35<BR>异想者- 21:58:41<BR> 但这样,组件还是要符合接口的要求,还是特定的类呀 <BR> <BR> dm ioc container只负责装配,不负责业务,刚才说的特定接口依赖 <BR>echoaholic- 21:59:52<BR> 是与装配有关的接口 <BR>echoaholic- 22:00:10<BR> interface IBoyGirlAware {<BR>IBoy boy-;<BR>IGirl girl-;<BR> } <BR>异想者- 22:00:16<BR> 明白了,谢谢 <BR>crane- 22:00:18<BR> 那就麻烦了, 业务程序员写这行代码(this.girl = girl;)<BR> 时,回乱写的<BR> <BR>crane- 22:00:24<BR> 会乱写的 <BR>echoaholic- 22:00:39<BR> 不会,因为是按javaBean的方法来写 <BR>crane- 22:00:54<BR> 没有约束,这个约束不是通过编译器来检查的 <BR>异想者- 22:01:01<BR> 但用ide是如何声称装配方法的呢 <BR>echoaholic- 22:01:29<BR> 没关系,spring把setter的具体实现看作是和业务有关的 <BR>crane- 22:01:37<BR> 方便的时候再请教 <BR>echoaholic- 22:02:05<BR> 也就是我只负责把你需要的组件送到指定的setter方法里,至于怎么处置,是你的事 <BR>echoaholic- 22:02:47<BR> 因为送出指定component是dm的业务,而具体你的bean怎么保管这个component,<BR> 是你的业务设计 <BR>冰云- 22:03:14<BR> http://gabriel.jarchitect.org/spring/BeanTutorial1.html <BR>异想者- 22:03:16<BR> 我在想 <BR>冰云- 22:03:32<BR> spring入门 <BR>异想者- 22:03:42<BR> 谢谢 <BR>&Limy- 22:03:56<BR> 我又回来了:) <BR>冰云- 22:04:26<BR> http://www.picocontainer.org/One+minute+description <BR>冰云- 22:04:29<BR> pico入门 <BR>echoaholic- 22:04:40<BR> 我们不用深究spring了,这里面的思路就是,component定义一种声明依赖的方式,然后<BR> dm ioc container负责把依赖送到 <BR>&Limy- 22:04:42<BR> 谁贴一下刚才讨论的信息? <BR>echoaholic- 22:05:09<BR> spring定义的依赖声明方式就是使用bean property <BR>echoaholic- 22:05:25<BR> 然后用setter送入 <BR>农民 - Javen- 22:05:26<BR> 会后我会整理好记录,并发布到网站的。 <BR>&Limy- 22:05:39<BR> ok:) <BR>echoaholic- 22:05:46<BR> 这便称作setter injection <BR>异想者- 22:06:06<BR> 你继续说吧,我一下子还想不明白,呵呵 <BR>异想者- 22:06:14<BR> 别在意 <BR>echoaholic- 22:06:24<BR> 我们可以看出,si和interface injection是有思路上的差异的 <BR>echoaholic- 22:07:28<BR>avalon-是把注入当作业务接口的扩展,而spring等则是采用声明依赖的方式 <BR>echoaholic- 22:07:59<BR> constructor injection就是在constructor里声明依赖 <BR>echoaholic- 22:08:20<BR> 也就是pico推荐的方式 <BR>echoaholic- 22:08:43<BR> 同样那个例子 <BR>echoaholic- 22:09:29<BR> class Something {<BR> IBoy boy;<BR> IGirl girl;<BR>IBoy boy, IGirl girl- { <BR> }<BR>- {<BR> .......<BR> }<BR> } <BR>echoaholic- 22:09:53<BR> 使用construtor里parameter声明他的依赖 <BR>echoaholic- 22:10:52<BR> 在pico里可以这样使用 <BR>echoaholic- 22:11:42<BR>Something.class-;<BR>IBoy.class, new ChineseBoy("icecloud"--;<BR>IGirl.class, new ChineseGirl("???"--;<BR> <BR>echoaholic- 22:12:30<BR>Something.class-;<BR>-; <BR>echoaholic- 22:13:11<BR>"icecloud"-; girl<BR>"???"-; <BR>echoaholic- 22:14:14<BR> 思路和spring其实是一样的,不过声明依赖的方式不同罢了,至于其它优劣的比较已经有<BR> 太多的讨论了,我就不重复了 <BR>echoaholic- 22:14:24<BR> ci就这样,大家有什么问题 <BR>异想者- 22:15:11<BR> 呵呵,我明白我的上一个问题了 <BR>echoaholic- 22:15:39<BR> 嘿嘿:) <BR>异想者- 22:15:46<BR> type1中由于使用了自己声明组件组装的方法 <BR>echoaholic- 22:16:01<BR> 从这里一印证就很容易明白了:) <BR>异想者- 22:16:11<BR> 所以外界对于它的输入的扩展是不利的 <BR>异想者- 22:16:33<BR> type2由于使用了外界组件声明的方法 <BR>echoaholic- 22:16:47<BR> to 异想<BR> <BR> u got the point <BR>异想者- 22:16:56<BR> 加上不同的javabean可以有不同的业务方法,所以... <BR>异想者- 22:17:11<BR> 好了,我不说了,暂时没有什么问题 <BR>异想者- 22:17:56<BR> 如果有时间,我想听听eclipse的容器,它是使用的哪一种呀 <BR>异想者- 22:18:13<BR> 其它的人不知愿意不愿意 <BR>echoaholic- 22:18:29<BR> 那么dependency injection就ok了<BR> <BR> 下面很好理解,configuration management IoC我们可以使用类似的configuration injection <BR>echoaholic- 22:18:46<BR> eclipse就不是dm ioc cotainer。。。。 <BR>echoaholic- 22:18:55<BR> 是component container <BR>echoaholic- 22:19:03<BR> 更复杂了 <BR>农民 - Javen- 22:19:24<BR> 好了,非常非常非常感谢 echo 的努力。 二个半小时了,也累坏了吧!<BR> <BR> 今天就到这里! <BR>异想者- 22:19:35<BR> <BR>郁也风- 22:19:38<BR> 呵呵,鼓掌 <BR>冰云- 22:19:43<BR> …… 好像还差一些 <BR>crane- 22:19:44<BR> <BR>冰云- 22:19:52<BR> 再开个 IOC(下) <BR>泥娃娃- 22:19:52<BR> 受益不少,<BR> 非常感谢 <BR>echoaholic- 22:19:57<BR> dm ioc和cm ioc之所以简单 <BR>郁也风- 22:19:57<BR> 虽说不太明白,不过只好自己努力了;) <BR>雪儿飞飞- 22:20:02<BR> <BR>╃(Chris-- 22:20:04<BR> 呵呵,非常感谢 <BR>农民 - Javen- 22:20:05<BR> 有机会以后再多多交流 <BR>异想者- 22:20:05<BR> 谢谢,如果可以的话,支持 <BR>crane- 22:20:14<BR>郁也风- 22:19:57<BR> 虽说不太明白,不过只好自己努力了;) <BR> <BR> 我也是 <BR>异想者- 22:20:24<BR>echoaholic- 22:19:57<BR> dm ioc和cm ioc之所以简单 <BR>异想者- 22:20:39<BR> echoaholic还没有说完,大家别说话 <BR>echoaholic- 22:21:09<BR> 因为他们的业务简单,只反转dm和cm,我们可以使用ioc的思想,翻转我们想反转的一切,<BR> 去解耦:) <BR>echoaholic- 22:21:21<BR> 结论:) <BR>echoaholic- 22:21:37<BR> 还有就是ioc != dependency injection <BR>echoaholic- 22:21:45<BR> 就没了:) <BR>crane- 22:22:10<BR> 支持 IOC(下) 然后我先预习去 <BR>异想者- 22:22:14<BR> ,真的完了吗,好期待,好享受 <BR>echoaholic- 22:22:41<BR> 累死我了,歇会先:) <BR>雪儿飞飞- 22:22:51<BR> 讲得非常好,我一点都不懂的,也有所了解 <BR>异想者- 22:22:51<BR> <BR>crane- 22:22:52<BR> 谢谢 echoaholic <BR>农民 - Javen- 22:23:10<BR> 是啊。 今天学习到不少的东西。 虽然我还没有太懂,但至少思想上有些指导了。 <BR> <BR>农民 - Javen- 22:23:43<BR> 还是来点酒吧。 酒是比较解累的。 <BR>农民 - Javen- 22:24:00<BR> 要不来红牛:<BR> <BR> 困了累了喝红牛!!! <BR>echoaholic- 22:24:58<BR>农民 - Javen- 22:24:00<BR> 要不来红牛:<BR> <BR> 困了累了喝红牛!!! <BR> <BR> 太甜...... <BR> <BR> <P></P> <P>echoaholic: 模式和架构高手. </P> <P>访问<A href="http://www.matrix.org.cn/">www.matrix.org.cn</A> 留意最新的讲座消息</P> <P> </P>
|