如何让spring mvc web应用启动时就执行特定处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让spring mvc web应用启动时就执行特定处理相关的知识,希望对你有一定的参考价值。

参考技术A 一、ApplicationContextAware接口
package org.springframework.context;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.Aware;
import org.springframework.context.ApplicationContext;

public interface ApplicationContextAware extends Aware
void setApplicationContext(ApplicationContext var1) throws BeansException;


二、ServletContextAware 接口
package org.springframework.web.context;

import javax.servlet.ServletContext;
import org.springframework.beans.factory.Aware;

public interface ServletContextAware extends Aware
void setServletContext(ServletContext var1);


三、InitializingBean 接口
package org.springframework.beans.factory;

public interface InitializingBean
void afterPropertiesSet() throws Exception;


四、ApplicationListener<ApplicationEvent> 接口
package org.springframework.context;

import java.util.EventListener;
import org.springframework.context.ApplicationEvent;

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener
void onApplicationEvent(E var1);

Spring MVC Web 应用程序:应用程序上下文启动两次

【中文标题】Spring MVC Web 应用程序:应用程序上下文启动两次【英文标题】:Spring MVC web app: application context starts twice 【发布时间】:2013-04-03 19:03:39 【问题描述】:

我正在开发一个 Spring MVC REST API。一切正常,这很好,但我从日志中注意到,每次我重新启动我的应用程序时,applicationContext 都会加载两次:一次是当 tomcat 加载 war 文件时,第二次是当第一次访问 web 应用程序时客户。

我举几个例子:

在我启动tomcat之后:

Apr 11, 2013 10:14:35 AM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.32
Apr 11, 2013 10:14:36 AM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
2013-04-11 10:14:36 INFO  ContextLoader:273 - Root WebApplicationContext:     initialization started
2013-04-11 10:14:36 INFO  XmlWebApplicationContext:510 - Refreshing Root     WebApplicationContext: startup date [Thu Apr 11 10:14:36 EDT 2013]; root of context hierarchy
2013-04-11 10:14:36 INFO  XmlBeanDefinitionReader:315 - Loading XML bean definitions     from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]
2013-04-11 10:14:36 INFO  XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-general.xml]
2013-04-11 10:14:37 INFO  XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-db.xml]
2013-04-11 10:14:37 INFO  XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-security.xml]
2013-04-11 10:14:37 INFO  SpringSecurityCoreVersion:33 - You are running with Spring Security Core 3.1.3.RELEASE
2013-04-11 10:14:37 INFO  SecurityNamespaceHandler:59 - Spring Security 'config' module version is 3.1.3.RELEASE

...

然后此刻我进行了第一个 API 调用:

INFO: Initializing Spring FrameworkServlet 'mvc-dispatcher'
2013-04-11 10:15:25 INFO  DispatcherServlet:455 - FrameworkServlet 'mvc-dispatcher': initialization started
2013-04-11 10:15:25 INFO  XmlWebApplicationContext:510 - Refreshing WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Thu Apr 11     10:15:25 EDT 2013]; parent: Root WebApplicationContext
2013-04-11 10:15:25 INFO  XmlBeanDefinitionReader:315 - Loading XML bean definitions from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]
2013-04-11 10:15:25 INFO  XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-general.xml]
2013-04-11 10:15:25 INFO  XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-db.xml]
2013-04-11 10:15:25 INFO  XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-security.xml]
2013-04-11 10:15:25 INFO  SecurityNamespaceHandler:59 - Spring Security 'config' module version is 3.1.3.RELEASE

这肯定不是正常行为??我的 web.xml 看起来像这样:

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>REST API</display-name>

<!-- Servlets -->
<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>

<!-- filters -->
<filter>
    <filter-name>httpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>httpMethodFilter</filter-name>
    <servlet-name>mvc-dispatcher</servlet-name>
</filter-mapping>
<filter>
    <filter-name>etagFilter</filter-name>
    <filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>etagFilter</filter-name>
    <servlet-name>mvc-dispatcher</servlet-name>
</filter-mapping>
<filter>
    <filter-name>CompressingFilter</filter-name>
    <filter-class>com.planetj.servlet.filter.compression.CompressingFilter</filter-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>statsEnabled</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CompressingFilter</filter-name>
    <servlet-name>mvc-dispatcher</servlet-name>
</filter-mapping>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>



<!-- listeners -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

【问题讨论】:

以下问题没有选择的答案,但也许它仍然可以帮助:***.com/q/11409237/866172 给出的第一个答案不适用于我。第二个答案对我不起作用,原因与它对 OP 不起作用 @Jalayn upvote - 你基本上指出了答案 【参考方案1】:

mvc-dispatcher 正在加载 2x,因为这是您定义它的方式

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

第一种方法通常用于加载诸如“全局”或“根”上下文之类的内容,您可以将所有由多个 servlet 上下文共享的 bean/资源放置在其中。

第二种方法通常用于加载特定的 servlet 上下文。正如第一个 answer in this post 指出的那样,它使用命名约定来查找 mvc-dispatcher 配置文件,因此您不需要显式定义它。

您是否在 mvc-dispatcher-servlet.xml 中定义了所有内容?如果是这样,您可以删除

<context-param>
  ..
</context-param>

定义,否则您可以(我建议为将来的可维护性)将您的配置分成多个文件。然后在 root-context.xml 中加载共享 bean/资源(通过第一种方法),并在 servletname-servlet.xml 下为每个 servlet 上下文加载每个 servlet 特定配置。

【讨论】:

我最终让它工作了:当我删除上下文参数时,它抱怨没有 applicationContext.xml。所以我创建了一个,我将所有 从 mvc-dispatcher.xml 移到 applicationContext.xml。然后我遇到了一些问题,因为 mvc-dispatcher.xml 中缺少一些东西:我必须在那里添加一个 和一个 然后一切正常。 我遇到了同样的问题并使用以下配置(使用 DispatcherServlet)解决了:` restorg.springframework.web .servlet.DispatcherServletcontextConfigLocation/WEB-INF/rest-servlet.xml初始化参数> 1 `

以上是关于如何让spring mvc web应用启动时就执行特定处理的主要内容,如果未能解决你的问题,请参考以下文章

如何让spring mvc web应用启动时就执行特定处理

如何让spring mvc web应用启动时就执行特定处理

spring mvc web应用启动时就执行特定处理(线程启动)

spring MVC tomcat启动 执行

模拟Spring如何在WEB中运行

Spring MVC Web 应用程序:应用程序上下文启动两次