Posted on 2006-02-14 15:48
Asktalk 阅读(2429)
评论(2) 编辑 收藏 所属分类:
Spring2
J2EE开发正在变得越来越复杂,J2EE已经发展为一个API、复杂化的编程和配置的复杂网络。这几年,新的框架和方法不断涌现从一定程度上缓解了开发的复杂和降低了开发的成本,但是要把这些Framework整合起来,如Struts,JSF,Webwork,Hibernate,JDO等等,并不是那么容易,就目前来看这个职位只有Spring能够胜任,采用的就是IoC技术。那么反向控制到底什么?
其实很简单。IOC(Inversion of control)和OOP中DIP(dependence Inversion )和Martin Fowler 称Dependency Injection(http://martinfowler.com/articles/injection.html)三者一样。又称好莱坞原则。目的要减少耦合。
反向控制(IoC)/依赖注入,这是Spring的核心,也是精髓。所谓IoC,对于spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。简单来说,
传统的程序开发,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像林心如,身材像林熙雷,唱歌像周杰伦,忽悠的像赵本山,技术像罗纳尔多之类的,然后婚介(Spring)就会按照我们的要求,提供一个MM,我们只需要去和她谈恋爱、结婚。如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介(Spring)这样一个类似容器的机构来控制。所有的类都会在spring容器中登记,告诉spring你的属性和方法,你需要什么女朋友,然后spring会在系统运行到适当的时候,把你要的女朋友主动给你,同时也把你交给其他需要你的资源。所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。少耦合使用配置文件,起初TXT, 到Window's ini文件,注册表,到近期xml文件。怎么读配置文件?现在一般都有专门的类(configuration,或context)。然后用工厂模式(Factory类),通过Java 反射(reflection)实例化具体类(instance)。主程序商业逻辑使用抽象类(Abstact)或接口。
Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。关于反射的相关资料请查阅java doc。
总之,降低耦合性是java发展的方向,现在除了IoC,我还没有找到更合适的解耦方法,欢迎大家批评,这仅是个人看法!