一 Application和BeanFactory区别:
1 BeanFactory提供了配置框架及基本功能,但无法支持Spring的aop功能和web应用
ApplicationContext提供BeanFactory的所有功能,Application还扩展以下功能:
支持不同的信息源,messageresource
资源访问,如:url和文件
支持aop特性,即支持应用事件
2 BeanFactory采用延迟加载的方式注入bean,即调用getbean()时才加载实例化,难以发现存在的Spring配置问题
ApplicationContext在容器启动时一次性创建了所有的bean
3 BeanFactory和ApplicationContext都支持BeanPostprocessor,BeanFactoryPostprocessor,
但是前者是主动注册,后者是自动注册。
二 IOC容器的使用:
1 创建Ioc配置中的抽象资源,包括BeanDefinition的定义信息
2 创建一个BeanFactory,这里使用的是DefaultListStableBeanFactory
3 创建一个BeanDefinition的读取器,这里使用的是XMLBeanDefinitionReader
4 载入loadBeanDefinition()
代码:
ClassPathResource res = new ClassPathresource(“bean.xml”);
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinition(res);
三 IOC容器的初始化:
1 Resource定位
初始化从构造方法的refresh()方法开始,
refresh调用refreshBeanFactory()方法,通过createBeanFactory构建了DefaultListableBeanFactory,
启动loadBeanDefinitions来载入BeanDefinition,然后利用abstractBeanDefinitionReader里的ResourceLoader解析resource,完成Resource定位
2 BeanDefinition的载入
通过xmlBeanDefinitionReader对象去载入和解析BeanDefinition,最后通过DenifitionParseDelegate去解析XML
3 IOC容器注册BeanDefinition
注册则是调用DefaultListableBeanFactory的registerBeanDefinistion()方法,通过HashMap来持有载入的BeanDefinition,即DefaultListableBeanFactory里的beanDefinitionMap。完成注册后DefaultListableBeanFactory容器中建立了bean的配置信息,初始化完成。