解答:我们为什么一般写param-name contextConfigLocation param-name ,contextConfigLocation是怎么来的?

首先要了解 context-param和 listener

context-paramlistener我相信大家都不陌生,当然可能也有人云里雾里的,需要官方解释的可以自己去看官方文档,我说下我自己理解的(不完全正确,有错的欢迎大家纠正):

  1. 我们必须明白一点就是web项目是有启动顺序的 ,这点非常重要,项目不可能一上来就什么都加载;
  2. 具体的的启动顺序我们不深究,所以web文件相当于告诉项目,我们要启动那些,毕竟程序是傻的,我们不告诉,他们不加载的;
  3. context-param 可以理解为需要在启动时加载的上下文对象,即保证后面的程序可以读取 context-param里面的值;
  4. listener 则是规定程序启动就执行 listener-class 所规定的实例,相当于告诉程序,启动(至于是启动前,启动后,或者启动中的状态不深究)的时候,把规定的实例执行一遍;
  5. 下面的代码是常见的Spring启动配置
 <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-config.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

为什么 param-name的参数一定是contextConfigLocation

我相信这是大多数初学者的疑问,param-name的参数可以不是contextConfigLocation吗?
答案是“可以的”
只是需要修改spring框架源代码(好像说了废话),万物皆可改!

言归正传,我们来探究下contextConfigLocation的出处

进入初始化的类
对应的代码

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
    public ContextLoaderListener() {
    }

    public ContextLoaderListener(WebApplicationContext context) {
        super(context);
    }

    public void contextInitialized(ServletContextEvent event) {
        this.initWebApplicationContext(event.getServletContext());
    }

    public void contextDestroyed(ServletContextEvent event) {
        this.closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }
}

分析代码我们可知 ContextLoaderListener extends ContextLoader 即类ContextLoaderListener继承了ContextLoader,我们在跑到它的父类ContextLoader去看下

在这里插入图片描述
我们可以看到,前面param-name就是在这里规定的,所以要启动spring的话,默认的参数必须为contextConfigLocation,当然可以自己去改源代码!
换上其它框架也需要启动的话,找到框架对应的param-name 即可,一般会在文档说明!

具体的实现可以参考 spring默认启动位置以及contextConfigLocation设置源码解析

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值