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

193

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

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

Quero saber de que serve os ApplicationContextaplicativos MVC? E em que tipo de beans são definidos ApplicationContext?

Sumit Trehan
fonte
5
Não acredito que seja uma duplicata do stackoverflow.com/questions/3652090/… Essa pergunta pergunta sobre o conteúdo do web.xmlarquivo; esta pergunta está perguntando sobre algumas aulas da primavera.
Raedwald
@ Raedwald isso não é verdade. A outra pergunta não está falando, web.xmlmas sim sobre as variantes de configuração do Spring XML bean de ApplicationContexte WebApplicationContext. Todas as definições de bean em applicationContext.xmlestarão disponíveis no ApplicationContextenquanto todas as definições de bean em *-servlet.xmlestarão disponíveis em a WebApplicationContext.
g00glen00b

Respostas:

228

Contexto do aplicativo da Web estendido Contexto do aplicativo, 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 em 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);
}

É possível fazer muitas coisas com a instância ServletContext, por exemplo, acessar recursos WEB-INF (configurações xml e etc.) chamando o método getResourceAsStream (). Normalmente, todos os contextos de aplicativos definidos em web.xml em um servlet Spring são contextos de aplicativos da Web, isso vai para o contexto de aplicativo da web raiz e para o contexto de aplicativo do servlet.

Além disso, dependendo dos recursos de contexto do aplicativo da Web, o aplicativo pode ser um pouco mais difícil de testar e você pode precisar usar a classe MockServletContext para teste.

Diferença entre o servlet e o contexto raiz O Spring permite criar hierarquias de contexto de aplicativo multinível, para que o bean necessário seja buscado no contexto pai, se não estiver presente no contexto atual do aplicativo. Em aplicações web como padrão, existem dois níveis de hierarquia, raiz e servlet contextos: Servlet e contexto raiz.

Isso permite que você execute alguns serviços como os singletons de todo o aplicativo (beans Spring Security e serviços básicos de acesso ao banco de dados geralmente residem aqui) e outro como serviços separados nos servlets correspondentes para evitar conflitos de nomes entre os 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 caixa quando você usa as classes de servlet spring: para configurar o contexto do aplicativo raiz, você deve usar a tag context-param em seu web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/root-context.xml
            /WEB-INF/applicationContext-security.xml
    </param-value>
</context-param>

(o contexto do aplicativo raiz é criado por ContextLoaderListener, declarado em web.xml

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

) e tag de servlet para os contextos do aplicativo de servlet

<servlet>
   <servlet-name>myservlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>app-servlet.xml</param-value>
   </init-param>
</servlet>

Observe que, se init-param for omitido, o spring usará myservlet-servlet.xml neste exemplo.

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

Boris Treukhov
fonte
2
Muito obrigado pela resposta. Ouvi dizer que existem dois tipos de contextos também usados ​​para um aplicativo da web. Um serve como contexto de aplicativo raiz, onde são fornecidas definições não relacionadas à Web, como serviço de exemplo, configurações dao, etc., e o outro é para configurações específicas da Web, como Mapeamentos de Manipuladores etc. O anterior serve como um contexto pai e o segundo serve como Contexto Filho. . Eu quero saber como declarar essa estrutura. Eu ouvi falar de alguns retornos de chamada ContextListener. Mas não sou muito claro sobre isso.
Sumit Trehan
1
Essa estrutura é codificada nas ferramentas de servlet do Spring, sempre há pelo menos dois contextos de aplicativo no aplicativo da web do spring, veja a resposta atualizada, espero que ajude.
Boris Treukhov
Excelente discription..i tinha algumas dúvidas sobre este scenario..as estou em fase inicial i encontrado a sua resposta útil para obter algum conhecimento ..
user533
"o bean necessário será buscado no contexto pai se não estiver presente no contexto atual do aplicativo". Você pode explicar como? Como um contexto de aplicativo da web pode acessar beans no contexto de aplicativo raiz? Link para algum exemplo?
anir
14

Voltando aos dias do Servlet, o web.xml pode ter apenas um <context-param>, portanto, apenas um objeto de contexto é criado quando o servidor carrega um aplicativo e os dados nesse contexto são compartilhados entre todos os recursos (Ex: Servlets e JSPs). É o mesmo que ter o nome do driver de banco de dados no contexto, o que não será alterado. Da mesma forma, quando declaramos o parâmetro contextConfigLocation no <contex-param>Spring, cria um objeto Application Context.

 <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.myApp.ApplicationContext</param-value>
 </context-param>

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

<servlet>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.secure.SecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <url-pattern>/secure/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.non-secure.NonSecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <url-pattern>/non-secure/*</url-patten>
</servlet-mapping>
Ben Tennyson
fonte
13

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

O WebApplicationContext é uma extensão do ApplicationContext simples que possui alguns recursos extras necessários para aplicativos da web. Ele difere de um ApplicationContext normal, pois é capaz de resolver temas (consulte Usando temas) e sabe a qual Servlet está associado (com um link para o ServletContext). O WebApplicationContext está vinculado no ServletContext e, usando métodos estáticos na classe RequestContextUtils, você sempre pode procurar o WebApplicationContext se precisar de acesso a ele.

Citado da referência da estrutura da web do Spring

Pela maneira servlet e raiz de contexto são ambos WebApplicationContext:

Hierarquia de contexto típica no Spring Web MVC

Nick Allen
fonte
6

ApplicationContext (Contexto do Aplicativo Raiz): Todo aplicativo Web Spring MVC possui um arquivo applicationContext.xml configurado como a raiz da configuração do contexto. Spring carrega esse arquivo e cria um applicationContext para o aplicativo inteiro. Este arquivo é carregado pelo ContextLoaderListener, que é configurado como um parâmetro de contexto no arquivo web.xml. E haverá apenas um applicationContext por aplicativo da web.

WebApplicationContext: WebApplicationContext é um contexto de aplicativo com reconhecimento da Web, ou seja, possui informações de contexto de servlet. Um único aplicativo da Web pode ter vários WebApplicationContext e cada servlet do Dispatcher (que é o controlador frontal da arquitetura Spring MVC) é associado a um WebApplicationContext. O arquivo de configuração webApplicationContext * -servlet.xml é específico para um DispatcherServlet. E como um aplicativo Web pode ter mais de um servlet de expedidor configurado para atender a várias solicitações, pode haver mais de um arquivo webApplicationContext por aplicativo Web.

Hetal Rachh
fonte
3

O contexto de aplicativo da Web , especificado pela WebApplicationContextinterface, é um contexto de aplicativo do Spring para aplicativos da Web. Ele possui todas as propriedades de um contexto de aplicativo Spring regular, uma vez que a WebApplicationContextinterface estende a ApplicationContextinterface e inclui um método para recuperar a API Servlet padrão ServletContextpara o aplicativo Web.

Além dos escopos padrão do bean Spring singletone prototype, existem três escopos adicionais disponíveis em um contexto de aplicativo da web:

  • request- define uma única definição de bean para o ciclo de vida de uma única solicitação HTTP; ou seja, cada solicitação HTTP tem sua própria instância de um bean criado na parte de trás de uma única definição de bean
  • session - define uma definição de bean único para o ciclo de vida de uma sessão HTTP
  • application - define uma única definição de bean para o ciclo de vida de um ServletContext
DimaSan
fonte