一,IOC容器和依赖反转模式
维基百科对“依赖反转”相关概念的叙述
平在2004年。Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他得出的结
论是依赖对象的获得被反转了。基于这个结论,他为控制反转创造了一个更好的名字:依賴注
入。许多非凡的应用(CHelloWorldjava更加优美。更加复杂)都是由两个或多个类通过彼此的
合作来实现业务逻辑的,这使得每个对象都需要与其合作的对象(也就是它所保赖的对象)的引
间。如果这个获取过程要靠自身实现,那么如你所见,这将导致代码高度耦合并且难以测试。
以上的这段话概括了区赖反转的要义,如果合作对象的引用成依赖关系的管理由具体对象東完成,会导致代码的高发料合和可谢试性的降低,这对复杂的面向对象系统的设计是非常
依赖控制反 转的实现有很多种方式,在Spring中, IoC容器是实现这个模式的教体,它可以在对象生成或初始化时直接将数据注人到对象中,也可以通过将对象引用注人到对象数据城中的方式来注人对方法调用的依赖。这种依赖注人是可以递归的,对象被逐易注人。就此而言,这种方案有一种完整而简洁的美感,它把对象的依赖关系有序地建立起来,简化了对象依赖关系的管理,在很大程度上简化了面向对象系统的复杂性。
关于如何反转对依赖的控制,把控制权从具体业务对象手中转交到平台成者框架中,是降低面向对象系统设计复杂性和提高面向对象系统可测试性的一个有效的解决方案。它促进TloC设计模式的发展,是loC容器要解决的核心向题。同时,也是产品化的IoC容器
IoC原理的应用在不同的语言中有很多实现,比如SmallTalk、C++、 Java等。在同~语言的实现中也会有多个具体的产品,Spring是Java语 言实现中最著名的一个。同时,loC也是Spring框架要解决的核心问题。
我们可以认为上面提到的调控系统是应用平台,或者更具体地说是IoC容器。通过使用IoC容器,对象依赖关系的管理被反转了,转到IoC容器中来了,对象之间的相互依赖关系由loC
容器进行管理,并由loc容器完成对象的注人。这样就在很大程度上简化了应用的开发,把应用从复杂的对象依赖关系管理中解放出来。简单地说,因为很多对象依赖关系的建立和维护并
不需要和系统运行状态有很强的关联性,所以可以把在面向对象编程中需要执行的诸如新建对象、为对象引用赋值等操作交由容器统-完成。这样一来,这些散落在不同代码中的功能相同的部分就集中成为容器的一部分,也就是成为面向对象系统的基础设施的一部分。
如果对面向对象系统中的对象进行简单分类,会发现除了一部分是数据对象外,其他很大一部分对象是用来处理数据的。这些对象并不常发生变化,是系统中基础的部分。在很多情
况下,这些对象在系统中以单件的形式起作用就可以满足应用的需求,而且它们也不常涉及数据和状态共享的问题。如果涉及数据共享方面的问题,需要在这些单件的基础上再做进一步
的处理。
同时,这些对象之间的相互依赖关系也是比较稳定的,一般不会随着应用的运行状态的改变而改变。这些特性使这些对象非常适合由IoC容器来管理,虽然它们存在于应用系统中,但是应用系统并不承担管理这些对象的责任,而是通过依赖反转把责任交给了容器(或者说平台)。了解了这些背景,Spring loC容器的原理也就不难理解了。在原理的具体实现上,Spring有着自己的独特思路、实现技巧和丰富的产品特性。关于这些原理的实现,下面会进行详细的分析。
二, Spring IoC的应用场景
同时,在应用开发中,以应用开发人员的身份设计组件时,往往需要引用和调用其他组件的服务,这种依赖关系如果固化在组件设计中,就会造成依赖关系的僵化和维护难度的增加,这个时候,如果使用IoC容器,把资源获取的方向反转,让IoC容器主动管理这些依赖关系,将这些依赖关系注人到组件中,那么会让这些依赖关系的适配和管理更加灵活。在具体的注人实现中,接口注人(Type 1 IoC)、setter注人(Type2 IoC)、构造器注人(Type 3 IoC)是主要的注入方式。在Spring的IoC设计中,setter注 人和构造器注人是主要的注入方式,相对而言,使用Spring时setter注入是常见的注人方式,而且为了防止注人异常,Spring IoC容器还提供了对特定依赖的检查。
另一方面,在应用管理依赖关系时,可以通过IoC容器将控制进行反转,在反转的实现中,如果能通过可读的文本来完成配置,并且还能通过工具对这些配置信息进行可视化的管理和浏览,那么肯定是能够提高对组件关系的管理水平,并且如果耦合关系需要变动,并不需要重新修改和编译Java源代码,这符合在面向对象设计中的开闭准则,并且能够提高组件系统设计的灵活性,同时,如果结合OSGi的使用特性,还可以提高应用的动态部署能力。
在具体使用Spring IoC容器的时候,我们可以看到,Spring IoC容器已经是一个产品实现。作为产品实现,它对多种应用场景的适配是通过Spring设计的IoC容器系列来实现的,比如在某个容器系列中可以看到各种带有不同容器特性的实现,可以读取不同配置信息的各种容器,从不同I/O源读取配置信息的各种容器设计,更加面向框架的容器应用上下文的容器设计等。这些丰富的容器设计,已经可以满足广大用户对IoC容器的各种使用需求,这时的Spring IoC容器,已经不是原来简单的Interface21框架了,已经成为一个IoC容器的工业级实现。下面,我们会对IoC容器系列的设计和实现进行详细分析