Um aplicativo web spring padrão (criado pelo Roo ou modelo "Spring MVC Project") cria um web.xml com ContextLoaderListener
e DispatcherServlet
. Por que eles não apenas usam DispatcherServlet
e fazem o carregamento da configuração completa?
Entendo que o ContextLoaderListener deve ser usado para carregar o material que não é relevante para a Web e o DispatcherServlet é usado para carregar o material relevante para a Web (Controladores, ...). E isso resulta em dois contextos: um pai e um filho.
Fundo:
Eu estava fazendo isso dessa maneira padrão por vários anos.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Handles Spring requests -->
<servlet>
<servlet-name>roo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring/webmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Isso geralmente causava problemas nos dois contextos e nas dependências entre eles. No passado, sempre fui capaz de encontrar uma solução e tenho a forte sensação de que isso torna a estrutura / arquitetura do software sempre melhor. Mas agora estou enfrentando um problema com os eventos dos dois contextos .
- No entanto, isso faz com que eu repense esse padrão de dois contextos, e estou me perguntando: por que devo me meter nesse problema, por que não carregar todos os arquivos de configuração de primavera com um DispatcherServlet
e remover ContextLoaderListener
completamente. (Ainda terei arquivos de configuração diferentes, mas apenas um contexto.)
Existe algum motivo para não remover o ContextLoaderListener
?