- São
applicationContext.xml
e estãospring-servlet.xml
relacionados de qualquer maneira no Spring Framework? - Os arquivos de propriedades declarados em
applicationContext.xml
estarão disponíveis paraDispatcherServlet
? - Em uma nota relacionada, por que eu preciso de um
*-servlet.xml
? Por queapplicationContext.xml
sozinho não é suficiente?
373
Respostas:
O Spring permite definir vários contextos em uma hierarquia pai-filho.
O
applicationContext.xml
define os beans para o "contexto do webapp raiz", ou seja, o contexto associado ao webapp.O
spring-servlet.xml
(ou o que você chamar) define os beans para o contexto de aplicativo de um servlet. Pode haver muitos deles em um aplicativo da web, um por servlet Spring (por exemplo,spring1-servlet.xml
para servletspring1
,spring2-servlet.xml
para servletspring2
).Beans in
spring-servlet.xml
pode fazer referência a beansapplicationContext.xml
, mas não vice-versa.Todos os controladores Spring MVC devem estar no
spring-servlet.xml
contexto.Na maioria dos casos simples, o
applicationContext.xml
contexto é desnecessário. Geralmente, é usado para conter beans compartilhados entre todos os servlets em um aplicativo da web. Se você tiver apenas um servlet, não há muito sentido, a menos que você tenha um uso específico para ele.fonte
Cenário 1
No aplicativo cliente (o aplicativo não é um aplicativo da web, por exemplo, pode ser um aplicativo swing)
Não há necessidade de web.xml . ApplicationContext como contêiner para obter o serviço de bean. Não há necessidade de contêiner de servidor da web. No test-client.xml , pode haver bean Simples sem controle remoto , bean com controle remoto .
Conclusão : No cenário 1 applicationContext e
DispatcherServlet
não estão relacionados.Cenário 2
Em um aplicativo de servidor (aplicativo implantado no servidor, por exemplo, Tomcat). Serviço acessado via comunicação remota do programa cliente (por exemplo, aplicativo Swing)
Definir ouvinte no web.xml
Na inicialização do servidor,
ContextLoaderListener
instancia os beans definidos em applicationContext.xml .Supondo que você tenha definido o seguinte em applicationContext.xml :
Os beans são instanciados a partir dos quatro arquivos de configuração test1.xml , test2.xml , test3.xml , test4.xml .
Conclusão : No cenário 2 applicationContext e
DispatcherServlet
não estão relacionados.Cenário 3
Em um aplicativo da web com o Spring MVC.
No web.xml, defina:
Quando o Tomcat é iniciado, os beans definidos no springweb-servlet.xml são instanciados.
DispatcherServlet
se estendeFrameworkServlet
. NoFrameworkServlet
bean, a instanciação ocorre para a mola. No nosso caso, springweb é FrameworkServlet.Conclusão : No cenário 3 applicationContext e
DispatcherServlet
não estão relacionados.Cenário 4
Em aplicativo da web com Spring MVC. springweb-servlet.xml para servlet e applicationContext.xml para acessar o serviço de negócios no programa do servidor ou para acessar o serviço DB em outro programa do servidor.
No web.xml, são definidos os seguintes:
Na inicialização do servidor,
ContextLoaderListener
instancia os beans definidos em applicationContext.xml ; supondo que você tenha declarado aqui:Os beans são todos instanciados dos quatro test1.xml , test2.xml , test3.xml , test4.xml . Após a conclusão da instanciação de bean definida em applicationContext.xml , os beans definidos em springweb-servlet.xml são instanciados.
Portanto, a ordem da instanciação é: a raiz (contexto do aplicativo) e, em seguida, FrameworkServlet.
Agora deve ficar claro por que eles são importantes em que cenário.
fonte
DispatcherServlet
não será chamado se o URL não terminar com .action?Mais um ponto que quero acrescentar. Em
spring-servlet.xml
que incluem verificação de componente para o pacote Controller. No exemplo a seguir, incluímos anotação de filtro para o pacote do controlador.Em
applicationcontext.xml
somarmos filtro para restante do pacote excluindo controlador.fonte
@Controller
beans no contexto de servlet (exigido pelo Spring MVC).Em palavras simples,
applicationContext.xml
define os beans que são compartilhados entre todos os servlets. Se o seu aplicativo tiver mais de um servlet, definir os recursos comuns noapplicationContext.xml
faria mais sentido.spring-servlet.xml
define os beans que estão relacionados apenas a esse servlet. Aqui está o servlet do expedidor. Portanto, seus controladores Spring MVC devem ser definidos neste arquivo.Não há nada errado em definir todos os beans no
spring-servlet.xml
se você estiver executando apenas um servlet em seu aplicativo da web.fonte
Na tecnologia Servlet, se você quiser passar qualquer entrada para um servlet específico, precisará passar no parâmetro init como no código abaixo.
Se você deseja passar algo em comum que é comum a todos os servlets, nesse momento, é necessário configurar os parâmetros de contexto. Exemplo
Portanto, exatamente assim, sempre que estivermos trabalhando com o Spring MVC, precisamos fornecer algumas informações ao servlet predefinido fornecido pelo Spring, que é o DispatcherServlet através do parâmetro init. Portanto, a configuração é como fallows, aqui estamos fornecendo o spring-servlet.xml como parâmetro init para DispatcherServlet.
Novamente, precisamos de alguns parâmetros de contexto. Isso é aplicável para toda a aplicação. Portanto, podemos fornecer o contexto raiz que é applicationcontext.xml A configuração é assim:
fonte
Os contextos de aplicativos fornecem um meio para resolver mensagens de texto, incluindo o suporte ao i18n dessas mensagens. Os contextos de aplicativos fornecem uma maneira genérica de carregar recursos de arquivos, como imagens. Os contextos de aplicativos podem publicar eventos em beans registrados como ouvintes. Certas operações no contêiner ou feijões no contêiner, que precisam ser manipuladas de maneira programática com uma fábrica de feijões, podem ser manipuladas declarativamente em um contexto de aplicativo. Suporte ao ResourceLoader: o recurso da Spring cria uma interface genérica flexível para manipular recursos de baixo nível. Um contexto de aplicativo em si é um ResourceLoader, portanto, fornece um aplicativo com acesso a instâncias de recursos específicas da implantação. Suporte ao MessageSource: o contexto do aplicativo implementa o MessageSource, uma interface usada para obter mensagens localizadas,
fonte