Spring核心实现篇
一、Spring Framework的核心:IoC容器的实现
1.1Spring IoC的容器概述
1.1.1 IoC容器和控制反转模式
依赖控制反转的实现有很多种方式。在Spring中,IOC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。这种依赖注入是可以递归的,对象被逐层注入。
关于如何反转对依赖的控制,把控制权从具体的业务对象手中转交到平台或者框架中,是降低面向对象系统设计复杂性和提高面向对象系统可测试性的一个有效的解决方案。它租金了IOC设计模式的发展。
通过使用IOC容器,对象关系依赖的管理被反转了,转到IOC容器中来了,对象之间的相互依赖的关系由IOC容器进行管理,并由IOC容器完成对象的注入。因为很多对象依赖关系的建立和维护并不需要和系统的运行状态有很强的关联性,所以可以把面向对象中需要执行的如新建对象、为对象引用赋值等操作交由容器来统一完成。
1.1.2 Spring IOC的应用场景
IOC设计模式,是解耦组件之间复杂关系的利器,Spring IOC模块就是一种实现。以应用开发人员的身份设计组件时,往往需要引用和调用其他组件的服务,这种依赖关系如果固化在组件的设计中,就会造成依赖关系的僵化和维护难度的增加,使用IOC容器,把资源获取的方向反转,让IOC容器主动管理这些依赖关系,将这些依赖关系注入到组件中,会让依赖关系的适配和管理更加灵活。在具体的注入实现中,接口注入、setter注入、构造器注入是主要的注入方式。在Spring的IOC设计中,setter注入和构造器注入是主要的注入方式。另一方面,在应用管理依赖关系时,可以通过IOC容器将控制进行反转,在反转的实现中,如果能通过可读的文本来完成配置,并且还能通过工具对这些配置信息进行可视化的管理和浏览,能够提高对组件关系的管理水平。并且如果耦合关系需要变动,并不需要重新修改和编译Java源代码,这符合面向对象设计中的开闭原则,如果结合osgi的使用特性,还可以提高应用的动态部署能力。
1.2 Ioc容器系列的设计与实现:BeanFactory和ApplicationContext
在Spring Ioc容器的设计中,有两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本的功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。
1.2.1 Spring的Ioc容器系列
作为IOC容器,需要为他的具体实现指定基本的功能规范,功能规范的设计表现为接口类BeanFactory,它体现了Spring为提供给用户使用的Ioc容器所设定的最基本的功能规范。对Spring的具体IOC容器的实现来说,他需要满足BeanFactory这个基本的接口定义,BeanFactory作为一个最基本的接口类出现在Spring的Ioc容器体系中。
在这些Spring提供的基本Ioc容器的接口定义和实现的基础上,Spring通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及他们之间的相互依赖关系。BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。对Ioc容器来说,BeanDefinition就是对依赖反转模式中管理的对象依赖关系的数据抽象,也就是容器实现依赖反转功能的核心数据结构,依赖反转都是围绕对这个BeanDefinition的处理来完成的。
同时,再使用IOC容器时,了解BeanFactory和ApplicationContext之间的区别对我们理解和使用Ioc容器也是比较重要的。
1.2.2 Spring IoC容器的设计
- 从接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一条主要的BeanFactory设计路径。在此路径,BeanFactory接口定义了基本的Ioc容器的规范。在这个接口定义中,包括了getBean()这样的IoC容器的基本方法。而HierarchicalBeanFactory接口在继承了BeanFctory的基本接口之后,增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲Ioc的管理功能。在接下来的ConfigurableBeanFactory接口中,主要定义了一些对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IOC容器,通过addBeanPostProcessor()配置Bean后置处理器等。
- 第二条接口设计主线是,以ApplicationContext应用上下文接口为核心的接口设计,涉及的主要接口设计有,从BeanFactory到ListableBeanFactory,再到ApplicationContext,再到我们常用的WebApplicationContext或者ConfigurableApplicationContext接口。
- 第三个路线涉及的是主要接口关系,而具体的IOC容器都是在这个接口体系下实现的,比如DefaultListableBeanFctory,这个基本IOC容器的实现就是实现了ConfigurableBeanFactory,从而成为一个简单的Ioc容器实现。
- 这个接口系统是以BeanFactory和ApplicationContext为核心的。而BeanFactory又是Ioc容器的最基本接口,在ApplicationContext的设计中,一方面,可以看到它继承了BeanFactory接口体系中的ListableBeanFactory、AutowireCapableBeanFactory、HierarchicalBeanFacctory等BeanFactory的接口,具备了BeanFactory Ioc容器的基本功能;另一方面,通过继承MessageSource、ResourceLoadr、ApplocationEventPublisher这些接口,BeanFactory为ApplicationContext赋予了更高级的Ioc容器特性。对于ApplicationContext而言,为了在Web环境中使用它,还设计了WebApplicationContext接口,而这个接口通过继承ThemeSource接口来扩充功能