Qual é a diferença entre ApplicationContext e WebApplicationContext no Spring MVC?

Qual é a diferença entre Contexto de Aplicativo e Contexto de Aplicativo da Web?

Estou ciente de que WebApplicationContext é usado para aplicativos orientados a arquitetura Spring MVC?

Eu quero saber qual é o uso de ApplicationContext em aplicativos MVC? E que tipo de beans são definidos no ApplicationContext ?

Contexto do aplicativo da Web estendido Contexto do aplicativo que é projetado para funcionar com o javax.servlet.ServletContext padrão para que ele possa se comunicar com o contêiner.

 public interface WebApplicationContext extends ApplicationContext { ServletContext getServletContext(); } 

Beans, instanciados no WebApplicationContext também poderão usar ServletContext se implementarem a interface ServletContextAware

 package org.springframework.web.context; public interface ServletContextAware extends Aware { void setServletContext(ServletContext servletContext); } 

Há muitas coisas possíveis para fazer com a instância ServletContext, por exemplo, acessando resources WEB-INF (xml configs e etc.) chamando o método getResourceAsStream (). Geralmente, todos os contextos de aplicativos definidos em web.xml em um aplicativo Spring de servlet são contextos de Aplicativo da Web, isso vale para o contexto de aplicativo da web raiz e o contexto de aplicativo do servlet.

Além disso, dependendo do contexto do aplicativo da Web, os resources podem tornar seu aplicativo um pouco mais difícil de ser testado e talvez seja necessário usar a class MockServletContext para teste.

Diferença entre o contexto de servlet e raiz O Spring permite que você construa hierarquias de contexto de aplicativos multiníveis, para que o bean necessário seja buscado no contexto pai, se não estiver presente no contexto de aplicativo atual. Em aplicativos da Web, por padrão, há dois níveis de hierarquia, os contextos raiz e de servlet: Servlet e contexto raiz .

Isso permite que você execute alguns serviços como singletons para todo o aplicativo (os beans de Spring Security e os serviços básicos de access a database geralmente residem aqui) e outro como serviços separados nos servlets correspondentes para evitar confrontos entre beans. Por exemplo, um contexto de servlet servirá as páginas da Web e outro implementará um serviço da Web sem estado.

Essa separação de dois níveis sai da checkbox quando você usa as classs de servlet de mola: para configurar o contexto de aplicativo raiz, você deve usar a tag context-param em seu web.xml

  contextConfigLocation  /WEB-INF/root-context.xml /WEB-INF/applicationContext-security.xml   

(o contexto do aplicativo raiz é criado por ContextLoaderListener que é declarado no web.xml

  org.springframework.web.context.ContextLoaderListener  

) e tag de servlet para os contextos de aplicação de servlet

  myservlet org.springframework.web.servlet.DispatcherServlet  contextConfigLocation app-servlet.xml   

Por favor note que se o init-param for omitido, então o spring irá usar myservlet-servlet.xml neste exemplo.

Consulte também: Diferença entre applicationContext.xml e spring-servlet.xml no Spring Framework

ApplicationContext applicationContext.xml é a configuração de contexto raiz para cada aplicativo da web. O Spring carrega o arquivo applicationContext.xml e cria o ApplicationContext para todo o aplicativo. Haverá apenas um contexto de aplicativo por aplicativo da web. Se você não declarar explicitamente o nome do arquivo de configuração de contexto em web.xml usando o parâmetro contextConfigLocation, o Spring pesquisará o applicationContext.xml na pasta WEB-INF e lançará FileNotFoundException se não encontrar este arquivo.

WebApplicationContext Além do ApplicationContext, pode haver vários WebApplicationContext em um único aplicativo da web. Em palavras simples, cada DispatcherServlet associado a um único WebApplicationContext. O arquivo xxx-servlet.xml é específico do DispatcherServlet e um aplicativo da Web pode ter mais de um DispatcherServlet configurado para manipular as solicitações. Em tais cenários, cada DispatcherServlet teria um xxx-servlet.xml separado configurado. Mas, applicationContext.xml será comum para todos os arquivos de configuração do servlet. Por padrão, o Spring carregará o arquivo chamado “xxx-servlet.xml” da sua pasta webapps WEB-INF, em que xxx é o nome do servlet em web.xml. Se você quiser alterar o nome desse nome de arquivo ou alterar o local, adicione initi-param com contextConfigLocation como nome do parâmetro.

Voltando aos dias do Servlet, web.xml pode ter apenas um , portanto, apenas um object de contexto é criado quando o servidor carrega um aplicativo e os dados nesse contexto são compartilhados entre todos os resources (Ex: Servlets e JSPs). É o mesmo que ter o nome do driver de database no contexto, que não será alterado. De maneira semelhante, quando declaramos o parâmetro contextConfigLocation em Spring cria um object Application Context.

   contextConfigLocation com.myApp.ApplicationContext  

Você pode ter vários Servlets em um aplicativo. Por exemplo, você pode querer lidar com / secure / * pedidos de uma maneira e / non-seucre / * de outra maneira. Para cada um desses Servlets, você pode ter um object de contexto, que é um WebApplicationContext.

  SecureSpringDispatcher org.springframework.web.servlet.DispatcherServlet  contextClass com.myapp.secure.SecureContext    SecureSpringDispatcher /secure/*   NonSecureSpringDispatcher org.springframework.web.servlet.DispatcherServlet  contextClass com.myapp.non-secure.NonSecureContext    NonSecureSpringDispatcher /non-secure/*  

A resposta aceita é a seguinte, mas há uma explicação oficial sobre isso:

O WebApplicationContext é uma extensão do ApplicationContext simples que possui alguns resources extras necessários para aplicativos da web. Ele difere de um ApplicationContext normal por ser capaz de resolver temas (consulte Uso de temas) e de saber com qual Servlet está associado (com um link para o ServletContext). O WebApplicationContext está vinculado no ServletContext e, usando methods estáticos na class RequestContextUtils, é possível consultar o WebApplicationContext se você precisar acessá-lo.

Citado da referência do framework web Spring

A propósito, o servlet e o contexto raiz são ambos webApplicationContext:

Hierarquia de contexto típica no Spring Web MVC