spring web,security + web.xml + mvc dispatcher + Bean创建两次

我有如下的Web.xml:

 mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1   mvc-dispatcher /   springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /api/secure/*  

[编辑]

在我添加了spring security后,我收到了错误!

java.lang.IllegalStateException:找不到WebApplicationContext:没有注册ContextLoaderListener?

然后我补充道

   contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml    org.springframework.web.context.ContextLoaderListener  

然后它似乎工作正常,但然后1)问题是豆被创建两次!

如果我只删除它:

  contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml   

但是留下然后Web应用程序根本不运行

[额外]

完整的Web.xml如下:

  Spring MVC Application  mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1   mvc-dispatcher /   springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /api/secure/*   contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml    org.springframework.web.context.ContextLoaderListener   

这是我的mvc-dispatcher-servlet.xml

                                                     

在servlet容器生命周期中,容器首先初始化ServletContextListener ,然后初始化FilterServlet实例。

Spring Web应用程序通常会加载两个上下文:根上下文和调度程序servlet上下文。 ContextLoaderListener类是一个ServletContextListener ,它加载应用程序(或根)上下文。 它通过context-param标识要加载的文件,其名称为contextConfigLocation ,如下面的web.xml中所示,如下所示

  contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml   

或者,默认情况下,通过在/WEB-INF/applicationContext.xml查找文件。 由于您已将/WEB-INF/mvc-dispatcher-servlet.xml指定为contextConfigLocation ,因此将加载该上下文。

完成此操作后,容器将初始化DispatcherServlet ,它还会加载上下文。 它通过名为contextConfigLocationinit-param元素标识文件加载,如下面的web.xml中所示

  dispatcher org.springframework.web.servlet.DispatcherServlet  contextConfigLocation /WEB-INF/spring/appServlet/some-random-location.xml   

或者,默认情况下,通过在/WEB-INF/name-of-your-servlet-servlet.xml查找文件。 换句话说,它获取元素的值并将-servlet.xml附加到它并在WEB-INF查找它。

由于您尚未指定名为contextConfigLocationinit-param ,因此DispatcherServlet将上下文文件加载到/WEB-INF/mvc-dispatcher-servlet.xml ,因为其名称为mvc-dispatcherDispatcherServlet加载的上下文可以访问ContextLoaderListener加载的bean,这就是我们称之为根上下文(以及其他子项)的原因。

所有这一切都表明, ContextLoaderListenerDispatcherServlet都是通过从/WEB-INF/mvc-dispatcher-servlet.xml的同一文件加载XmlWebApplicationContext来创建自己的ApplicationContext副本。

确定您认为应该对整个应用程序可用的bean或配置,并将它们放入将由ContextLoaderListener加载的文件中。 确定您认为可用于DispatcherServlet的bean或配置,并将它们放在其上下文文件中。

http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch16s02.html

在初始化DispatcherServlet时,框架将在Web应用程序的WEB-INF目录中查找名为[servlet-name] -servlet.xml的文件,并创建在那里定义的bean(覆盖用于定义的任何bean的定义)全球范围内的同名)。

所以你可以删除context-param:

  contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml   

Spring MVC然后创建一个新的any-name.xml并放置特定于上下文的bean,如Spring-security.xml,并加载安全bean。

新的xml将是这样的

          /WEB-INF/jdbc.properties           

现在将其包含在web.xml中

   contextConfigLocation  /WEB-INF/login-security.xml, /WEB-INF/application-context.xml   

希望这会帮助你。