Em um aplicativo Web baseado na estrutura do Spring, como o arquivo de configuração de contexto do aplicativo do Spring é applicationgContext.xml
carregado automaticamente?
Ao executar um projeto da Web, o servidor de aplicativos (JBoss, Tomcat etc.) primeiro lê o web.xml
arquivo no caminho do código-fonte do projeto , analisa a configuração e encontra a configuração ContextLoaderListener
, para que ContextLoaderListener
o contextInitialized
método na classe seja executado e o método será chamado neste initWebApplicationContext()
método De acordo com o nome do método, podemos ver que esse método é usado para inicializar um WebApplicationContext. O entendimento simples é inicializar um contêiner Spring em um aplicativo Web. Na initWebApplicationContext()
implementação do código subsequente do método, o arquivo especificado será carregado de acordo web.xml
com as contextConfigLocation
propriedades configuradas no método applicationContext.xml
e o contêiner Spring será inicializado de acordo com este arquivo.
Se não web.xml
houver contextConfigLocation
parâmetros de configuração , o applicationgContext.xml
arquivo não pode ser carregado ?
Se não houver contextConfigLocation
parâmetros de configuração , o aplicativo procurará o /WEB-INF/applicationContext.xml
arquivo no diretório raiz do aplicativo por padrão , ou seja, este é um caminho do arquivo carregado por padrão.
Após a conclusão da inicialização do WebApplicationContext nesse aplicativo Web, o que isso tem a ver com ServletContext?
No initWebApplicationContext
interior do método de inicialização irá context
poupar a ServletContext
, em particular, é mantido para um Map
atributo tipo, key
é WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
, value
é um exemplo específico de um WebApplicationContext objecto.
Se você deseja ServletContext
incluir isso no código WebApplicationContext
, como fazer isso?
A estrutura Spring fornece uma WebApplicationContextUtils
classe de ferramenta, que getWebApplicationContext
pode ser obtida através do método dessa classe de ferramenta .
Agora ServletContext
, para que é usado?
ServletContext
Alguns métodos são definidos para facilitar a comunicação Servlet
com o Servlet
contêiner. Em um aplicativo Web, todos Servlet
são comuns ServletContext
. Quando o Spring é usado em conjunto com um aplicativo Web, o contêiner Spring é armazenado ServletContext
nele. Em termos leigos, é ApplicationContext
armazenado em um ServletContext
contêiner. Em uma propriedade Map.
Não tinha que entender web.xml
na Listener
, Filter
e Servlet
ordem de inicialização é?
Primeiro, <listener>
instancie a classe de ouvinte declarada com o rótulo, chame o método do objeto de instância de classe de ouvinte contextInitialized()
, inicialize os dados de contexto do aplicativo, <filter>
instale a classe de filtro declarada com o rótulo e chame o método do objeto de instância de classe de filtro init()
; Se uma <servlet>
tag é usada na <load-on-startup>
tag, ela é Servlet
instanciada na ordem do menor para o maior valor , e o init()
método correspondente é chamado .
Falando nisso Servlet
, DispatcherServlet
alguém no Spring MVC sabia? Conte-me sobre seu princípio de implementação?
DispatcherServlet
É o principal distribuidor do SpringMVC, implementa a distribuição de solicitações e é o ponto de entrada para o processamento de solicitações. É um Servlet
. Quando o aplicativo é iniciado, a DispatcherServlet
inicialização executa o init
método. DispatcherServlet
O init
método encontrado no código-fonte é herdado HttpServletBean
. Nesse método de inicialização, um WebApplicationContext
objeto será instanciado e a inicializada será context
armazenada ServletContext
nele Servlet
para associar-se ao contêiner Spring. DispatcherServlet
No onRefresh
método, inicializar várias estratégias de solicitação de processamento, tais como o upload de arquivos Políticas, estratégia URL processamento de solicitação, visualizar a estratégia de processo de mapeamento, as estratégias de tratamento de exceções, a maioria da implementação destas estratégias são uma lógica iniciar WebApplicationContext
a busca, não conseguiu encontrar No caso de recarregar , as várias estratégias no DispatcherServlet
mesmo diretório DispatcherServlet.properties
, como inicialização HandlerMapping
, registro de várias estratégias de processamento de solicitação e classes de processamento.
Especificamente, como funciona a DispatcherServlet
distribuição de solicitações?
Primeiro, a estrutura Spring MVC percorre todos os beans no contêiner Spring quando é iniciada, percorre os métodos na classe anotada @Controller
ou @RequestMapping
anotada, @RequestMapping
mescla os valores da anotação na classe e no método e usa @RequestMapping
os valores relevantes dos parâmetros da anotação (como value
, por exemplo , method
etc.) um pacote RequestMappingInfo
, este Controller
exemplo, o método e o método de parâmetros (tipo, as notas, etc.) para dentro da embalagem HandlerMethod
, e, em seguida, para RequestMappingInfo
que key
, HandlerMethod
para value
manter a um de Map
uma estrutura de handlerMethods
a.
Em seguida, a @RequestMapping
anotação de value
(isto é, um pedido caminho) valores tomados, que é url
, em seguida, url
a key
fim RequestMappingInfo
de value
, em um depósito de Map
uma estrutura do urlMap
imóvel.
Quando o cliente envia um pedido, em conformidade com um pedido URL
para urlMap
encontrar, localizar RequestMappingInfo
, e, em seguida, de acordo RequestMappingInfo
com a handlerMethods
pesquisa, para pesquisar o correspondente HandlerMethod
, em seguida HandlerMethod
encapsulado HandlerExecutionChain
; então percorrer todos os recipientes HandlerAdapter
classe de implementação, encontrar apoiar este pedido HandlerAdapter
, tais como RequestMappingHandlerAdapter
, em seguida, executar O método front ( preHandle
método) do interceptador Spring MVC , analisa e converte os parâmetros de solicitação e, em seguida, (usando reflexão), chama o Controller
método correspondente específico para retornar um ModelAndView
objeto, executa o método post do interceptador ( postHandle
método) e retorna o resultado Execute o processamento e, finalmente, execute o afterCompletion
método.