首先我们要对整个spring有一个整体认识了解,这尤为重要,不然,看了很多都迷茫,不知道看的有什么用。之后再具体看里面的源码
IOC容器,有很多拥有不同特性的产品。比如:水桶,有的形状不同,有的材质不同,但都是水桶。
那么spring的IOC是通过读取文本来进行一个注入 管理对象。
Resource
Resource该抽象类,就是通过I/O进行一个读取资源文件。这也是spring的IOC的主要抽象。旗下有很多的具体实现 也就是不同的水桶。
BeanFactory
而BeanFactory定义了IOC的基本功能。(水桶,能装水)
BeanDefinition
BeanDefinition用来管理各种对象以及他们之间的依赖关系。它是一个对象,这个对象用来抽象对象(比如我们需要人所以建立了person类)之间的关系。是个bean对象。
IOC容器的接口设计
1. BeanFactory->HierarchicalBeanFactory->ConfigurableBeanFactory 是一条主要的BeacFactory设计路径。
BeanFactory定义了基本的IOC规范。
HierarchicalBeanFactory增加了getParentBeanFactory()接口功能,使得工厂有双亲管理IOC容器功能。
ConfigurableBeanFactory 定义一些对BeanFactory的配置功能,给ParentBeanFactory设置set方法等。
2. 以ApplicationContext上下文接口为核心的接口设计(很多接口都途径ApplicationContext)。
ApplicationContext听过继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,使得其添加很多新特性。
3. 具体IOC容器都在这个接口体系下实现的。(DefaultListableBeanFactory,实现了ConfigurableBeanFactory ,成为一个简单的IOC容器实现,XmlBeanFactory就是在其基础上做的扩展)
XmlBeanFactory,一些IOC基础操作是实现上述接口,附属的功能,从名字可以知道,有从xml得到BeanDefinition
//获得Resource,spring用来操作i/o的类
ClassPathResource res = new ClassPathResource("beans.xml");
//创建工厂
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
//创建读取器,将工厂与BeanDefinition传入,将后者回写到工厂中
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
//将res读取获得beanDefinition,回写到工厂
reader.loadBeanDefinitions(res);
上面就是XmlBeanFactory的实现方式。
ApplicationContext就是一个高级IOC容器。
扩展了MessageSource接口,可以支持国际化实现,开发多语言版本。
实现ResourceLoader和Resource,扩展了访问资源。可以从不同地方得到bean
继承了ApplicationEventPublisher,支持应用事件。
以具体实现FileSystemXmlApplicationContext为例,他继承了AbstractXmlApplicationContext,它 也是继承ApplicationContext。
该类,只需要实现,自身设计相关功能(通过file实例化) 和 启动IOC容器refresh()过程。
refresh操作类似,只需要封装调用即可。