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
?
Respostas:
No seu caso, não, não há razão para manter o
ContextLoaderListener
eapplicationContext.xml
. Se o seu aplicativo funciona bem apenas com o contexto do servlet, que permanece com isso, é mais simples.Sim, o padrão geralmente incentivado é manter coisas que não são da Web no contexto de aplicativos da Web, mas não passa de uma convenção fraca.
Os únicos motivos convincentes para usar o contexto no nível de aplicativo da web são:
DispatcherServlet
que precisam compartilhar serviçosDelegatingFilterProxy
,OpenEntityManagerInViewFilter
etc.)Nada disso se aplica a você, portanto a complexidade extra não é garantida.
Apenas tenha cuidado ao adicionar tarefas em segundo plano ao contexto do servlet, como tarefas agendadas, conexões JMS, etc. Se você esquecer de adicionar
<load-on-startup>
ao seuweb.xml
, essas tarefas não serão iniciadas até o primeiro acesso do servlet.fonte
DispatcherServlet
sem uma configuração - se você fizesse isso, não teria interface web. Todo o material MVC tem que entrar lá.Você também pode configurar o contexto do aplicativo ao contrário. Por exemplo, para fazer o OpenEntityManagerInViewFilter funcionar. Configure o ContextLoaderListener e, em seguida, configure seu DispatcherServlet com:
Apenas verifique se o valor do parâmetro contextConfigLocation está vazio.
fonte
Quero compartilhar o que fiz no meu aplicativo Spring-MVC:
No
we-mvc-config.xml
eu adicionei apenas as classes anotadas com @Controller:Nos
applicationContext.xml
arquivos, adicionei todo o resto:fonte