loadBeanDefinitions(Resource...resources)方法和上面分析的3个方法类似,同样也是调用XmlBeanDefinitionReader的loadBeanDefinitions方法。
从对AbstractBeanDefinitionReader的loadBeanDefinitions方法源码分析可以看出该方法做了以下两件事:
首先,调用资源加载器的获取资源方法resourceLoader.getResource(location),获取到要加载的资源。
其次,真正执行加载功能是其子类XmlBeanDefinitionReader的loadBeanDefinitions方法。
7.资源加载器获取要读入的资源:
XmlBeanDefinitionReader通过调用其父类DefaultResourceLoader的getResource方法获取要加载的资源,其源码如下:
[java]- //获取Resource的具体实现方法 public Resource getResource(String location) {
- Assert.notNull(location, Location must not be null); //这里除了带有classpath标识的Resource
- if (location.startsWith(CLASSPATH_URL_PREFIX)) { return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
- } else {
- try { //这里处理URL标识的Resource定位
- URL url = new URL(location); return new UrlResource(url);
- } catch (MalformedURLException ex) {
- //如果既不是classpath标识,又不是URL标识的Resource定位,则调用 //容器本身的getResourceByPath方法获取Resource
- return getResourceByPath(location); }
- } }
FileSystemXmlApplicationContext容器提供了getResourceByPath方法的实现,就是为了处理既不是classpath标识,又不是URL标识的Resource定位这种情况。
现在,Bean定义的Resource得到了,下面我们继续跟随程序执行方向,分析XmlBeanDefinitionReader的loadBeanDefinitions方法。
8. XmlBeanDefinitionReader加载Bean定义资源:
[java]- //XmlBeanDefinitionReader加载资源的入口方法 public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
- //将读入的X