Spring源码学习笔记

 最近在看spring的源码,担心忘掉了,打个记号,也请大家一起指正其中的错误,防止走歪路。

从xml配置文件加载入手

xml配置文件加载由

org.springframework.context.support.ClassPathXmlApplicationContext完成,该类的继承关系如下:


Spring源码学习笔记
 实际调用:

AbstractApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"beans.xml"});
		PersonService service = (PersonService)context.getBean("personService");

 Beans.xml加载在创建ClassPathXmlApplicationContext实例时完成,上面调用方法仅仅是ClassPathXmlApplicationContext构造函数之一。

  该构造函数调用具体内部步骤如下:

1.  创建PathMatchingResourcePatternResolver实例,该实例用于后续将文件路径解析为资源对象。

2.       处理参数中传入的路径数组:去掉每个路径的前后空格

3.       调用refresh()刷新实例容器(Context),refresh方法定义在ClassPathXmlApplicationContext的父类:AbstractApplicationContext.

   refresh()包括刷新前准备,获取bean工厂实例,bean工厂使用前配置,加载bean定义文件(这里是xml,但没有初始化bean实例),初始化bean实例,初始化消息资源,初始化事件处理器,初始化生命周期依赖的bean,附加的刷新,注册监听实例,完成beanFactory初始化,完成刷新。当然如果出现异常需要回滚刷新并删除所有的bean实例。

 

获取bean工厂实例:刷新工厂(刷新前准备、删除Context中所有的bean实例,关闭原beanFactory,

 重新获取beanFactory实例,自定义beanFactory实例配置(目前默认实现为空),加载bean配置文件)

  获取beanFactory:

   

DefaultListableBeanFactory beanFactory = createBeanFactory();
customizeBeanFactory(beanFactory);

加载bean定义的xml文件

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {
		// Create a new XmlBeanDefinitionReader for the given BeanFactory.
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

		// Configure the bean definition reader with this context's
		// resource loading environment.
		beanDefinitionReader.setResourceLoader(this);
		beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

		// Allow a subclass to provide custom initialization of the reader,
		// then proceed with actually loading the bean definitions.
		initBeanDefinitionReader(beanDefinitionReader);
		loadBeanDefinitions(beanDefinitionReader);
	}

相关推荐