Spring代码分析一:加载与初始化
一般的Web项目都会在web.xml中加入Spring监听器,内容如下:
其中的有两句比较重要,我们来看看:
现在我们引入BeanFactoryLocator,它是Spring配置文件的一个定位器,Spring官方给它的定义是用来查找,使用和释放一个BeanFactory或其子类的接口。下面我们看看此图:
此方法分为两作了两件事,
第一,初始化上下文,主意这里初始化的是从web.xml配置参数里的Spring配置文件,也是上面讲loadParentContext方法里的
refCount:用来记录实例被外部引用的记数,当调用locator.useBeanFactory(parentContextKey)方法时,引用数就会加1,当调用CountingBeanFactoryReference#release方法时,引用数就会减1,当它变成0时,Spring就会释放掉它占用的内存,同时也会销毁掉它definition变量引用的BeanFactory。下次再调用locator.useBeanFactory(parentContextKey)就会重新初始化BeanFactory。说到release,请同学们参考ContextLoader中如下的两条语句:
// 在调用CountingBeanFactoryReference#release后,即使对象已经销毁,这个Map仍然可以返回locator对象。
上面这句仅仅是做了如下工作:
再来看看Spring是如果进行初始化ApplicationContext的。就以XmlWebApplicationContext来说,它继承了ConfigurableWebApplicationContext这个接口,里面有个refresh()方法,我们可以看看它的实现(AbstractApplicationContext):String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
?
Spring环境
加载组件:ContextLoaderListener
配置路径:Servlet环境初始化参数contextConfigLocation指定的路径
缺省路径: 没有缺省路径
Spring环境的父环境
加载组件:ContextLoaderListener和ContextSingletonBeanFactoryLocator
配置路径:Servlet环境初始化参数locatorFactorySelector指定Bean工厂定位器使用的给BeanFactory,Servlet环境初始化参数parentContextKey指定Bean工厂定位器用于查找BeanFactory的关键字
缺省路径: parentContextKey的缺省路径是classpath*:beanRefFactory.xml
这里我们还有一个功能相近的类没有进行说明:
ContextJndiBeanFactoryLocator
有兴趣的同学可以自己看一下。
转自:http://www.cnblogs.com/bobzeng/articles/1877140.html