2014-10-08 4 views
1

У меня есть простое приложение Spring MVC с jsp и классом контроллера, развернутым на сервере tomcat. Настройка работает отлично для нескольких запросов. Я назвал класс контроллера com.mypackage.mvcController.Почему два экземпляра контроллеров весенних бобов создаются в приложении Spring MVC?

Теперь я использовал jvisualvm, чтобы найти количество экземпляров, которые этот класс контроллера создан. Он показывает 2. jvisualvm screenshot

  1. Почему количество экземпляров этого конкретного компонента контроллера составляет два?
  2. По умолчанию весенние бобы являются одинарными. Конечно, здесь экземпляры не меняются с несколькими запросами, но должны быть такими.

Вот моя конфигурация: web.xml

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>/WEB-INF/pages/welcome.jsp</welcome-file> 
    </welcome-file-list> 

</web-app> 

MVC-диспетчерская-servlet.xml файл

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="com.myPackage" /> 

    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/pages/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 

</beans> 

и структура проекта:

enter image description here

Тип контроллера:

package com.myPackage; 

    import org.springframework.stereotype.Controller; 
    import org.springframework.web.bind.annotation.RequestMapping; 

    @Controller 
    @RequestMapping("serverHit") 
    public class mvcController { 

     @RequestMapping 
     public String sayHello() { 
      System.out.println("spring test"); 
      return "result"; 
     } 
    } 
+0

Можете ли вы опубликовать свой web.xml? – luboskrnac

+0

Опубликуйте свою конфигурацию. –

+0

Вы дважды загружаете определения bean-компонентов, может использовать contextConfigLocation и загружать один и тот же файл конфигурации. –

ответ

4

Вы загружаете контекст дважды.

  1. Использование определения сервлета диспетчерской решетки.

  2. Использование прослушивателя контекстного загрузчика, как я уже упоминал в комментарии. -> вам не нужно делать этот шаг.

Посмотрите на это:

Why use context loader listener?

+0

Спасибо u. Это делается при использовании сервлета диспетчера, нет необходимости в прослушивании загрузчика контекста. Я удалил слушателя, теперь он показывает только один экземпляр объекта. – MugunthanSelvaraj

+0

Круто, тогда вы можете принять ответ. –

3

Весенние бобы по умолчанию являются «пружинными одноточечными». Это означает один экземпляр для каждого контекста. Веб-приложение обычно имеет как минимум два контекста: корневой и веб-. Скорее всего, у вас есть экземпляр контроллера для обоих из них. @ComponentScan - наиболее вероятная ошибка - попробуйте добавить фильтры, которые исключат любые контроллеры из корневого контекста.

Смежные вопросы