IOC容器概述
大家说起spring最大的优势或者说特点就是依赖注入和控制反转,其实这两个特点对IOC容器来说是一样的。
问题:什么是控制反转?哪些方面的控制被反转了?
答案:依赖对象的获得(依赖对象的引用的获得)被反转了。
解释:许多应用都是由多个类通过相互“合作”来实现业务逻辑的。而这种情况下使得每个对象都需要与其合作对象的引用,如果这个引用的获取过程要靠对象自身实现------>导致代码高耦合并难以测试。
结论:面向对象的系统中,对象封装了数据(属性)和对数据的处理(方法)-----所以-------对象的依赖关系常常体现在对数据和方法的依赖上,所以把这种依赖关系的注入交给框架或IOC容器去做,大大降低了代码的耦合。
应用控制反转后,当对象被创建时,由一个IOC容器中的所有将其所依赖的对象的引用传递给它,即依赖被注入到对象中。
所以,控制指的是一个对象如何获取它所依赖的对象的引用,而反转的意思就是本来由程序完成对依赖的对象的引用的获取变成由IOC容器来实现。
IOC容器系列
我们做个比喻:水桶=====IOC容器
水桶有各种类型来适用不同的场景=========IOC容器有各种类型来适应不同的需求
所有的水桶都具备能装水的功能===========所有的IOC容器都具备控制反转的功能
水桶需要“产品规格说明书”-------来制定基本的功能规范。
IOC容器也需要接口类去定义基本的功能规范,而这个接口类就是BeanFactory。
所以,一系列的IOC容器都必须满足BeanFactory这个基本的接口定义。
问:那么水桶有了,水桶里面的水到底是什么?
答:BeanDefinition=======水桶里面的水
Spring 通过定义BeanDefinition来管理应用中的各种对象以及它们之间的相互依赖关系。
BeanDefinition就是在控制反转的模式中对管理的对象依赖关系的数据抽象,也是容器实现依赖反转功能的核心数据结构,这里先做简单介绍。
IOC容器的设计
IOC容器的接口设计图:
整个IOC容器的接口设计大致可以分为两条主线:
第一条主线:
BeanFactory(接口)------>HierarchicalBeanFactory------->ConfigurableBeanFactory
BeanFactory:定义基本的IOC容器规范,包括IoC容器的基本方法,例:getBean()
HierarchicalBeanFactory:继承BeanFactory的基本接口,增加getParentBeanFactory()接口功能,使得BeanFactory具备双亲IoC容器的管理功能。
ConfigurableBeanFactory:定义对BeanFactory的配置功能,例:通过setParentBeanFactory()设置双亲IoC容器,通过addBeanPostProcessor()配置Bean后置处理器,等等......
第二条主线:
BeanFactory->ListableBeanFactory->ApplicationContext->WebApplicationContext->ConfigurableApplicationContext.
在这条数显中,ListableBeanFactory和HierarchicalBeanFactory连接BeanFactory接口定义和ApplicationContext应用上下文的接口定义。
ListableBeanFactory:细化许多BeanFactory的接口功能,例:getBeanDefinitionNames()方法
ApplicationContext:继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory简单IoC容器的基础上添加了许多对高级容器的特性,而这个接口通过继承ThemeSource接口来扩充功能。
总结:BeanFactory接口定义勾勒出IoC的基本轮廓,而各种具体类可以看成是容器附加了某种功能的具体实现,也就是容器体系中的具体容器产品。
网友评论