首页 > 代码库 > BeanDefinition的Resource定位

BeanDefinition的Resource定位

1.以编程的方式使用DefaultListableBeanFactory时,首先定义一个Resource定位容器使用的BeanDefiniton。这时使用的是ClassPathResource,这意味着Spring会在类路径中去寻找以文件形式存在的BeanDefinition信息。

 

ClassPathResource res = new ClassPathResource("beans.xml");

 

这里定义的Resource并不能由DefaultListableBeanFactory直接使用,Spring通过BeanDefinitionReader来对这些信息进行处理。在这里,我们也可以看到使用ApplicationContext相对于直接使用DefaultListableBeanFactory的好处。因为在ApplicationContext中,Spring已经为我们提供了一系列加载不同Resource的读取的实现,而DefaultListableBeanFactory只是一个存粹的IoC容器,需要为它配置特定的读取器才能完成这些功能。当然,有利就有弊,使用DefaultListableBeanFactory这种底层的容器,能提高定制IoC容器的灵活性。

2.回到我们经常使用的ApplicationContext上来,例如FileSystemXmlApplicationContextClassPathXmlApplicationContext以及XmlWebApplication等。简单地从这些类的名字上分析,可以清楚地看到它们可以提供哪些不同的Resource读入功能,比如FileSystemXmlApplicationContext可以从文件系统载入ResourceClassPathXmlApplicationContext可以从Class Path载入ResourceXmlWebApplicationContext可以在Web容器中载入Resource,等等。

3.下面以FileSystemXmlApplicationContext为例,通过分析这个ApplicationContext的实现来看看它是怎样完成这个Resource定位过程的。作为辅助,我们可以在下图中看到相应的ApplicationContext集成体系

FileSystemXmlApplicationContext的继承体系

 

1.从源码的实现角度,我们可以近距离关心以FileSystemXmlApplicationContext为核心的继承体系,如下图所示。

1.从上图可以看到,这个FileSystemXmlApplicationContext已经通过继承AbstractApplicationContext具备了ResourceLoader读入以Resource定义的BeanDefinition的能力,因为AbstractApplicationContext基类DefaultResourceLoader。下面我们看看FileSystemXmlApplicationContext具体实现

 

BeanDefinition的Resource定位