下面咱们来介绍DefaultResourceLoader的最后一个孩子:AbstractApplicationContext。AbstractApplicationContext是Spring容器最重要的一个类,这个抽象类中提供了几乎ApplicationContext的所有操作。AbstractApplicationContext虽然继承自DefaultResourceLoader,但是AbstractApplicationContext没有对DefaultResourceLoader进行扩展,因此它继承的目的是单纯复用DefaultResourceLoader的功能。
在咱们的web.xml 中一般都有一段这样的配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:smart-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
这段配置注册了一个叫ContextLoaderListener的监听器,这个监听器实现了ServletContextListener,也就是说,ContextLoaderListener的的钩子函数会在服务器启动时和停止时被调用到,ContextLoaderListener钩子函数内容如下:
/**
* Initialize the root web application context.
*/
@Override
public void contextInitialized(ServletContextEvent event) {
initWebApplicationContext(event.getServletContext());
}
/**
* Close the root web application context.
*/
@Override
public void contextDestroyed(ServletContextEvent event) {
closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
}
contextInitialized(ServletContextEvent event)方法服务器启动时会被调用,而该方法又调用了其父类的一个方法,
public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
该方法返回一个WebApplicationContext实例,深究代码发现,实际该方法返回的是XmlWebApplicationContext的实例,
XmlWebApplicationContext又是AbstractApplicationContext的重重孙子,贴上图咱们感受下:
从这张图咱们可以发现,XmlWebApplicationContext是DefaultResourceLoader的重重重孙子!!!这说明对web应用,ResourceLoader 其实就是DefaultResourceLoader,而DefaultResourceLoader的getResourceByPath(String path)又长这样:
protected Resource getResourceByPath(String path) {
return new ClassPathContextResource(path, getClassLoader());
}
该方法返回ClassPathContextResource实例,啰嗦了这半天,咱们想总结的是 XmlWebApplicationContext默认的资源加载器是它自己,也可以说是DefaultResourceLoader,因为它没有做扩展,功能上是一样的,默认的资源表示方式,也是classpath,因此咱们在以后的工作中也应该像框架一样多多使用classpath,毕竟框架已经帮我们做了验证,所以,咱们以后的开发,加载资源的方法咱们选classpath。
以上纯属个人理解,如果有误,还请指正,谢谢。