Contextos raiz e filho Antes de ler mais, entenda que -
A primavera pode ter vários contextos ao mesmo tempo. Um deles será o contexto raiz e todos os outros contextos serão contextos filhos.
Todos os contextos filhos podem acessar os beans definidos no contexto raiz; mas o contrário não é verdade. O contexto raiz não pode acessar os beans de contextos filhos.
ApplicationContext:
applicationContext.xml é a configuração de contexto raiz para todos os aplicativos 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 procurará o applicationContext.xml na pasta WEB-INF e lançará FileNotFoundException se não conseguir encontrar esse arquivo.
ContextLoaderListener Executa o trabalho de inicialização real para o contexto do aplicativo raiz. Lê um parâmetro de contexto "contextConfigLocation" e passa seu valor para a instância de contexto, analisando-o em caminhos de arquivos potencialmente múltiplos que podem ser separados por qualquer número de vírgulas e espaços, por exemplo, "WEB-INF / applicationContext1.xml, WEB-INF / applicationContext2.xml ". ContextLoaderListener é opcional. Apenas para fazer um ponto aqui: você pode inicializar um aplicativo Spring sem nunca configurar o ContextLoaderListener, apenas um web.xml mínimo básico com o DispatcherServlet.
DispatcherServlet DispatcherServlet é essencialmente um Servlet (estende HttpServlet) cujo objetivo principal é lidar com solicitações da Web recebidas que correspondem ao padrão de URL configurado. É necessário um URI de entrada e encontra a combinação certa de controlador e visualização. Portanto, é o controlador frontal.
Ao definir um DispatcherServlet na configuração de primavera, você fornece um arquivo XML com entradas de classes do controlador, exibe mapeamentos etc. usando o atributo contextConfigLocation.
WebApplicationContext Além do ApplicationContext, pode haver vários WebApplicationContext em um único aplicativo Web. Em palavras simples, cada DispatcherServlet associado a um único WebApplicationContext. O arquivo xxx-servlet.xml é específico ao 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 a todos os arquivos de configuração do servlet. Por padrão, o Spring carregará o arquivo chamado "xxx-servlet.xml" da pasta WEB-INF dos webapps, em que xxx é o nome do servlet em web.xml. Se você deseja alterar o nome desse arquivo ou alterar o local, adicione initi-param com contextConfigLocation como nome do parâmetro.
Comparação e relação entre eles:
ContextLoaderListener vs DispatcherServlet
ContextLoaderListener cria o contexto do aplicativo raiz. As entradas DispatcherServlet criam um contexto de aplicativo filho por entrada de servlet. Contextos filhos podem acessar beans definidos no contexto raiz. Os beans no contexto raiz não podem acessar os beans nos contextos filhos (diretamente). Todos os contextos são adicionados ao ServletContext. Você pode acessar o contexto raiz usando a classe WebApplicationContextUtils.
Depois de ler a documentação do Spring, a seguir está o entendimento:
a) Os contextos de aplicativos são hierárquicos e o WebApplicationContexts. Consulte a documentação aqui.
b) ContextLoaderListener cria um contexto de aplicativo da Web raiz para o aplicativo da Web e o coloca no ServletContext. Esse contexto pode ser usado para carregar e descarregar os beans gerenciados por mola, respectivamente, de qual tecnologia está sendo usada na camada do controlador (Struts ou Spring MVC).
c) DispatcherServlet cria seu próprio WebApplicationContext e os manipuladores / controladores / resolvedores de exibição são gerenciados por esse contexto.
d) Quando ContextLoaderListener é usado em conjunto com DispatcherServlet, um contexto de aplicativo da web raiz é criado primeiro como dito anteriormente e um contexto filho também é criado pelo DispatcherSerlvet e é anexado ao contexto do aplicativo raiz. Consulte a documentação aqui.
Quando trabalhamos com o Spring MVC e também usamos o Spring na camada de serviços, fornecemos dois contextos de aplicativos. O primeiro é configurado usando ContextLoaderListener e o outro com DispatcherServlet
Geralmente, você definirá todos os beans relacionados ao MVC (controlador e visualizações etc.) no contexto DispatcherServlet e todos os beans transversais, como segurança, transação, serviços etc. no contexto raiz por ContextLoaderListener.
Consulte isso para obter mais detalhes:
https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html