1.我们重点看看AbstractRefreshableApplicationContext的refreshBeanFactory方法的实现,这个refreshBeanFactory被FileSystemXmlApplicationContext构造函数中的refresh调用。在这个方法中,通过createBeanFactory构建了一个IoC容器供ApplicationContext使用。这个IoC容器就是我们前面提到过的DefaultListableBeanFactory,同时,它启动了loadBeanDefinitions来载入BeanDefinition,这个过程和前面以编程的方式来使用IoC容器(XmlBeanFacoty)的过程非常类似。
1 protected final void refreshBeanFactory() throws BeansException { 2 // 这里判断,如果已经建立了BeanFactory,则销毁并关闭该BeanFactory 3 if (hasBeanFactory()) { 4 destroyBeans(); 5 closeBeanFactory(); 6 } 7 // 这里是创建并设置持有的DefaultListableBeanFactory的地方 8 // 同时调用loadBeanDefinitions载入BeanDefinition的信息 9 try { 10 DefaultListableBeanFactory beanFactory = createBeanFactory(); 11 beanFactory.setSerializationId(getId()); 12 customizeBeanFactory(beanFactory); 13 loadBeanDefinitions(beanFactory); 14 synchronized (this.beanFactoryMonitor) { 15 this.beanFactory = beanFactory; 16 } 17 } 18 catch (IOException ex) { 19 throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); 20 } 21 }