Spring源码学习笔记
最近在看spring的源码,担心忘掉了,打个记号,也请大家一起指正其中的错误,防止走歪路。
从xml配置文件加载入手
xml配置文件加载由
org.springframework.context.support.ClassPathXmlApplicationContext完成,该类的继承关系如下:
实际调用:
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); }