Spring5:就这一次,搞定资源加载器之AbstractApplicationContext

本文详细介绍了Spring容器中AbstractApplicationContext类的作用及其实现原理,并解释了如何通过ContextLoaderListener监听器初始化WebApplicationContext。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面咱们来介绍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。

以上纯属个人理解,如果有误,还请指正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值