Ioc模式 Dependency Injection模式和AOP讨论
http://www.jdon.com/AOPdesign/Ioc.htm
这篇文章不是初级概念读物,因此,一般初学者比较难懂,这篇文章其实是一篇探讨类的文章,我试图通过这篇文章找出依赖注射的优点,以及如何正确使用。
有人以为依赖注射模式打开了框架产品大门,其实,在这概念出现之间,框架产品基本都已经做了,在我设计JdonSD框架时早就使用了这样的注射机制。
但是使用依赖注射开发框架时必须注意它的特点,否则很难把握使用,通过这篇文章我总结了这些特点:首先它只是转移了依赖,而不是消除,而且依赖注射被移植到客户端,这就有一个限制:具体子类必须和注射事件激活在同一个地方,也就是说:药水和注射动作必须结合在一起。注射动作的能量来自两个来源:一个系统自身启动的能量,通过java application的main()实现,在main方法中,可以将具体子类(药水)注射到picocontainer中;
还有一个是系统运行时,由系统用户通过界面键盘输入和鼠标激活的能量,这种能量一般是传递到MVC模式的action中,你可以在action中将具体子类(药水)注射到picocontainer,但是你会发现,这样使用的价值不大,几乎为零,不如使用工厂模式;或者Ioc第一类型,其实EJB的JNDI就是在这种场合下使用的,所以,EJB JNDI虽然烦琐一点,但是从picocontainer和Spring等提供的IOC新实现方式来看,他们还是无法代替JNDI的作用,因此由此提出J3EE(不是J2EE)真是有些唐突啊。
我的这篇文章,就是试图得出picocontainer或Spring之类的局限性,因为任何一个事物都有自己的应用范围,没有全能的技术和思想,找出新事物的局限性,你也许就能把握它了。
不过,这篇文章确实不是为了说明Picocontainer,而是着重从过去和未来的高度认识Ioc模式,因为Picocontainer很简单,只是使用Picocontainer作为举例,当然最好使用Alvaon举例,可惜它太复杂,我也不喜欢它。
另外,也许是先入为主原因,看banq的这篇文章有点怪怪的
有些翻译没有采用国内最贴切的翻译(可能是怕涉嫌抄袭的原因,呵呵),个人感觉pawa的IOC文章也很不错
其实JNDI只是一个访问接口,就像JDBC,和IoC不是对等的,IoC中也可以使用JNDI自动获取分布式的依赖组件,比如通过配置文件声明.
BTW,哪些应用是真正需要CMP的?
记得学习OO时有这样一个说法:是外界的一个触发,导致消息在一个对象网(web of objects)的运作。就象我们现实生活中人类的合作。这也就是斑竹所说的“启动能量”的问题。那么这种关系比我们用类图画出的静态的持久性关系比较更能反映系统的功能性,这是依赖性关系。
项目的成功有时更依赖于业务人员或开发人员对业务的了解。那么这些业务如何更好的让计算机程序接受呢?本人愚见,如果用JNDI的方式,即TYPE I,那么是程序人员自己定义和处理了业务的操作;而如果是TYPE II && III,就可以把一些工作更好的交给关注业务的人员。
现在的spring采用留有setXXX的方式进行类及类间倚赖注册,其实就是AOP中的advice。那这种advice可以说是有框架动态关注的,通过的方式更多的采用Intercepter,这些Intercepter(join point)就构成了横切。那么灵活性和可扩展性就相应增加很多。
同样,象spring一样,无论业务还是这种临时的依赖都可以通过XML文件来进行配置,进一步,可以通过界面,图形,程序自动化方式(xdoclet,cglib)等方式来生成,那么程序可控性,效率会进一步提高。
Banq,这个B b的构造变量应该是CImp.class吧。
从你的例子,我看不到需要使用一个额外的库的需要啊。
我以前一直都是让构造函数初始化一些接口变量,没想别的,就象你另一个帖子说的,能拖延的,就拖延,不想过早做决定而已。
只是不知道这东西也给起了一个好听的名字"ioc"。
但是,我在最终拖无可拖,必须做assemble的时候,都是直接调用实现类的工厂或者构造函数,不曾觉得需要一个container来做什么注册class之类的动作。
那么,为什么不
|
|
换句话说,我的疑问比较低级:Pico到底能为我做什么?我为什么想用pico?
ejb container能帮我做分布式,persistence,事务。这个pico能做什么呢?
抽象地说,pico类似动态代理,可以实现AOP,Naning项目采取的是pico,还有你想做容器之类的软件也可以,例如portlet container就可以用pico,Exo项目就是这么用的,挺不错。