2015-03-31 2 views
0

У меня есть вопрос о контексте весны. Мое приложение использует весенний и весенний планировщик. В web.xml, я заявил:Весенний загрузчик контекста

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

Мой вопрос:

Если я объявил org.springframework.web.context.ContextLoaderListener в web.xml, планировщик будет работать в два раза, все бобы дубликата, и App времени запуска около 160 секунд.

Если я удалю org.springframework.web.context.ContextLoaderListener, исключение весны исключает: No WebApplicationContext found: no ContextLoaderListener registered. Время запуска приложения сокращается до 80 секунд.

Как я могу решить эту проблему? Спасибо всем!

+1

Разделите конфигурацию. Не делайте 'ContextLoaderListener' и' DispatcherServlet' загружать те же файлы конфигурации. Если вы сделаете это, все будет загружено дважды. –

+0

Почему вы даже думаете об использовании конфигурации XML? Это 2015 год - http://www.kubrynski.com/2014/01/understanding-spring-web-initialization.html –

ответ

0

Спасибо @ M.Deinum, но я не понимаю вашу идею. Вот моя web.xml:

<context-param> 
    <param-name>contextClass</param-name> 
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
    </context-param> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>com.htc.epos.api.bootstrap</param-value> 
    </context-param> 

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

    <servlet> 
    <servlet-name>webapp</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextClass</param-name> 
     <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
    </init-param> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
       com.htc.epos.api.bootstrap.WebAppConfig 
       com.htc.epos.api.bootstrap.AppConfig 
     </param-value> 
    </init-param> 
    </servlet> 
+0

Почему вы определяете 'AnnotationConfigWebApplicationContext' два раза? – Braj

0

Подумайте @ M.Deinum прав; разделить ваши бобы через то, что удаляет и что нормально. Я делаю это в моем web.xml:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/classes/spring/root-context.xml</param-value> 
</context-param> 

<servlet> 
    <servlet-name>remoting</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/classes/spring/remoting-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>remoting</servlet-name> 
    <url-pattern>/remoting/*</url-pattern> 
</servlet-mapping> 

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

корневой context.xml содержит все мои обычные бобы (услуги, хелперы, калькулятор, JMS слушателей, запланированные задачи и т.д.).

remoting-servlet.xml указывает только те службы, которые должны быть открыты через HttpInvokerServiceExporter. В корне нет импорта или ссылок на bean-компоненты, кроме таких, как ref = «historyWebService» для экспортера.

Из чего я понимаю, вы в итоге получаете 2 контекста приложения: 1 корень и 1 удаленный доступ. Удаленный наследует все бобы из корня, поэтому вы не объявляете или не создаете экземпляр боба дважды (я думаю) !!! У некоторых, похоже, нет продублированных двойных бобов (т. Е. 2 ​​задачи, 2 jms-прослушивателя и т. Д.).

+0

На самом деле, я использую аннотацию для конфигурации. – namtn

+0

Затем два файла xml могут быть простыми компонентами для сканирования соответствующих пакетов. Таким образом, вы поддерживаете некоторый уровень контроля над тем, какие бобы загружаются в какой контекст. – shuttsy

0

У меня есть 2 файла конфигурации:

1. AppConfig: 

    @Configuration 
    @EnableScheduling 
    @EnableTransactionManagement 
    @EnableJpaRepositories("com.test.api.repository") 
    @PropertySource("classpath:application.properties") 
    public class AppConfig { 
      ............... 
    } 

2. WebInitializer 

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
    return new Class<?>[0]; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
    return new Class<?>[] { WebAppConfig.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
    return new String[] { "/" }; 
    } 

    @Configuration 
    @EnableWebMvc 
    @ComponentScan(basePackages = {"com.test.api"}) 
    public static class WebAppConfig extends WebMvcConfigurerAdapter { 

    ................... 
    } 
} 

В WebAppConfig, если я изменю @ComponentScan(basePackages = {"com.test.api"}) на веб-пакет @ComponentScan(basePackages = {"com.test.api.web"}), поэтому весной фасоль не дублировать и планировщик не дважды баллотировался. Но когда-нибудь это исключение:

error: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 
Смежные вопросы