Spring框架中context-param与servlet中init-param的contextConfigLocation的区别
2017-05-10 15:09
561 查看
最近在使用spring这一个框架做定时任务的时候,发现一个问题。当我们不在浏览器中调用一下我们的接口,是不会自动运行定时文件的,这个原因是什么呢?刚开始的时候,使我费解了很长事件,不知道问题出现再哪里。但是当冷静下来思考一下的时候,发现了问题出现再servlet中。接着,对它进行分析一下。
在springmvc这个框架中,一般spring默认存在两个配置文件,一个是applicationContext.xml,另一个是spring-servlet.xml。一般情况下,我们会把注解中的自动加载,定时器的自动加载等内容写在spring-servlet.xml。然后把spring-servlet.xml,放在web.xml文件下的servlet中进行初始化。例如:
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
而将applicationContext.xml配置成全局的形式,例如:
2
3
4
5
6
7
1
2
3
4
5
6
7
对比一下,就会发现问题所在。spring-servlet.xml因为被配置在servlet的初始化过程中,所以如果不初始化servlet,那么spring-servlet.xml是不会被发现的。如果我们将定时器的注解加载过程放在spring-servlet.xml中,如果不进行页面的刷新,是不会经过DispatcherServlet这个跳转器的,所以也就不会加载spring-servlet.xml文件,所以定时任务可能就不会被触发。如果经过了这个DispatcherServlet这个跳转器,即被初始化。所以定时任务才会被执行。
而如果将注解的自动加载内容,例如:
1
放在了applicationContext.xml中。因为当服务器运行起来之后,就会自动加载applicationContext.xml文件,所以定时任务会立即被执行。
如果想要避免这种错误的发生,最简单的方法就是。将需要启动服务器之后,立刻就要知道的内容,例如
2
1
2
,加到applicationContext.xml文件中即可。
另一种方法就是,将spring的所有配置文件都放在context-param(上下文参数)中进行加载,例如:
2
3
4
5
6
7
1
2
3
4
5
6
7
这样所有的问题就可以解决。
在springmvc这个框架中,一般spring默认存在两个配置文件,一个是applicationContext.xml,另一个是spring-servlet.xml。一般情况下,我们会把注解中的自动加载,定时器的自动加载等内容写在spring-servlet.xml。然后把spring-servlet.xml,放在web.xml文件下的servlet中进行初始化。例如:
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet.xml</param-value> </init-param> </servlet>1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
而将applicationContext.xml配置成全局的形式,例如:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:applicationContext.xml, classpath:spring-servlet.xml </param-value> </context-param>1
2
3
4
5
6
7
1
2
3
4
5
6
7
对比一下,就会发现问题所在。spring-servlet.xml因为被配置在servlet的初始化过程中,所以如果不初始化servlet,那么spring-servlet.xml是不会被发现的。如果我们将定时器的注解加载过程放在spring-servlet.xml中,如果不进行页面的刷新,是不会经过DispatcherServlet这个跳转器的,所以也就不会加载spring-servlet.xml文件,所以定时任务可能就不会被触发。如果经过了这个DispatcherServlet这个跳转器,即被初始化。所以定时任务才会被执行。
而如果将注解的自动加载内容,例如:
<context:component-scan base-package="control"/><mvc:annotation-driven />1
1
放在了applicationContext.xml中。因为当服务器运行起来之后,就会自动加载applicationContext.xml文件,所以定时任务会立即被执行。
如果想要避免这种错误的发生,最简单的方法就是。将需要启动服务器之后,立刻就要知道的内容,例如
<context:component-scan base-package="control"/> <mvc:annotation-driven />1
2
1
2
,加到applicationContext.xml文件中即可。
另一种方法就是,将spring的所有配置文件都放在context-param(上下文参数)中进行加载,例如:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:applicationContext.xml, classpath:spring-servlet.xml </param-value> </context-param>1
2
3
4
5
6
7
1
2
3
4
5
6
7
这样所有的问题就可以解决。
总结
从上面出现的问题,我们不难发现。spring框架在加载web配置文件的时候。首先加载的是context-param配置的内容,而并不会去初始化servlet。只有进行了网站的跳转,经过了DispatcherServlet的导航的时候,才会初始化servlet,从而加载init-param中的内容。相关文章推荐
- Spring框架中context-param与servlet中init-param的contextConfigLocation的区别
- Spring框架中context-param与servlet中init-param的contextConfigLocation的区别
- Servlet配置web.xml中的context-param和init-param区别
- servlet中配置文件web.xml中的参数context-param和init-param区别
- action="post" 、 servletconfig 、 servletcontext 、getPrintWiter() 、context-param、 init-param(第一个完整的servlet)
- [j2ee][servlet]<context-param>与<init-param>的区别与作用
- context-param和init-param区别及config对象应用
- servlet中init-param与context-param的区别
- 解答上篇Servlet研究的问题(取初始化参数问题):context-param和init-param区别
- servlet中配置文件web.xml中的参数context-param和init-param区别
- Servlet中init-param与context-param的区别
- servlet中配置文件web.xml中的参数context-param和init-param区别
- servlet中配置文件web.xml中的参数context-param和init-param区别
- Servlet中web.xml 文件参数 context-param 与 init-param的区别
- context-param和init-param区别
- web.xml之<context-param>与<init-param>的区别与作用
- <context-param>与<init-param>的区别与作用
- <context-param>与<init-param>的区别与作用
- <context-param>与<init-param>的区别与作用含与Spring整合时的文件配置
- web.xml之context-param与init-param的区别与作用