不积跬步,无以至千里。
IOC
控制反转并不是依赖注入,但依赖注入便是控制反转。反转的地方便是创建对象的权力被转移了,权力便代表责任,也称责任被反转。
在没有使用spring framwork的时候,创建对象需要我们亲力亲为,包括创建对象所依赖的基本数据(包括其他对象)。
- 没有控制反转的时候
我想喝奶茶,必须自己去购买材料,自己制作,然后才能享受奶茶。
- 控制反转后
我想喝奶茶,只需要到奶茶店告诉店员,然后我就能喝上香甜的奶茶。
由此可见,第二种方式,确实比第一种方式省力省时。
spring中最简单的ioc容器
几个重要的类或者接口
- org.springframework.beans.factory.BeanFactory
- 定义了容器的规范,是一个接口,没有具体的实现。
- 定义了容器最基本的功能。
- org.springframework.beans.factory.config.BeanDefinition
是容器中bean对象依赖关系的数据抽象,也就是容器实现依赖反转功能的数据结构。
- org.springframework.beans.factory.xml.XmlBeanFactory
是容器最底层的实现,通过读取xml配置文件,对对象进行管理。
- org.springframework.beans.factory.support.DefaultListableBeanFactory
这个类其实就是最简单容器默认实现,XmlBeanFactory就是在这个基础上再次进行了封装。
实现机制
- 定义一个最基本的功能(由BeanFactory定义)。
- 在最基本的功能上添加一些新功能(其余的接口继承BeanFactory接口)
- 创建具体的实现类,其中默认的最基本的容器实现便是DefaultListableBeanFactory,其次在这个容器上进行了封装的XmlBeanFactory(目前已经不被推荐)。
- 创建一个数据结构,用于抽象对象间的依赖关系。(BeanDefinition)
- 需要一个资源读取类。(BeanDefinitionReader)
编程式的使用容器,理解容器
- 创建IOC配置文件的抽象资源,即读取对应的xml文件,并创建一个资源对象。
- 创建一个BeanFactory对象,用于管理bean。
- 把抽象资源载入BeanDefinition的读取器BeanDefinitionReader。
- 在BeanDefinitionReader的一个回调配置中,把BeanDefinition传给BeanFactory。
- 总结: 从定义好的配置文件地址中读取配置,通过BeanDefinitionReader解析配置,然后将BeanDefinition传给BeanFactory,于是最终的IOC就建立起来了。