Quando estamos trabalhando em um projeto, usaremos um ouvinte para obter arquivos de configuração de mola e retirar os grãos de que precisamos. Por exemplo, para fazer a página inicial do site. Supondo que a lógica de negócios em segundo plano do produto seja bem feita, precisamos criar um ouvinte e consultar os dados da página inicial na inicialização do projeto e colocá -los no aplicativo, ou seja, o método de chamar a lógica de negócios de produtos de fundo no ouvinte, ou seja, precisamos obter os feijões correspondentes configurados na primavera na primavera. Crie o ouvinte primeiro:
1. Crie um initDatalistener
Crie um ouvinte initDatalistener herda servletContextListener:
/** * @Description: TODO (usado para inicializar os dados quando o projeto iniciar) * @Author Eson_15 * */// @componente // ouvinte é um componente da camada da web. É instanciado pelo tomcat, não instanciado pela primavera. Não posso ser colocado na classe pública da primavera initDatalistener implementa servletContextListener {Private ProductService ProduckerService = NULL; // Products Service Define a lógica de negócios relacionada ao produto @Override public void anoc)E configure o ouvinte em web.xml:
Como mencionado acima, alguma lógica de negócios do produto é definida no produto da Products Service, e esse serviço de produtos é entregue à primavera para o gerenciamento. Então, como conseguimos esse objeto? A primeira coisa a ter certeza é: não podemos divulgar por nós mesmos, porque se for lançado, não tem nada a ver com o COI da primavera ... existem três maneiras principais de alcançá -lo. Analisamos um por um e finalmente comparamos as vantagens e desvantagens.
2. Carregue o arquivo Beans.xml diretamente
Este método é simples e grosseiro. Você não precisa carregar o arquivo de configuração? Ok, vou carregá -lo, como segue:
//@componente // ouvinte é um componente da camada da web. É instanciado por Tomcat, não na primavera. Não pode ser colocado na classe pública da primavera initdatalistener implementa servetlextextlistener {private Products Service ProduckerService = null; // ProductService define a lógica de negócios relacionada ao produto @Override public void contextDestroyed (Evento ServletContextevent) {} @Override public void contextinitialized (servletContexTevent Event) {// obtenha a classe de negócios lógica de produtos Productice Query Information Application.xtExt = ClassPlApLictLicationClication ProductService = (ProductService) context.getBean ("ProductService"); System.out.println (ProductService); // Saída para ver se você o obtém // a seguir são as operações específicas relacionadas ao ProductionService ...}}Esse método é completamente bom e a ideia é muito clara. Primeiro, carregue o arquivo de configuração Beans.xml e depois obtenha o feijão. No entanto, depois de iniciar o Tomcat, vamos dar uma olhada na saída de informações do console:
Neste ponto, devemos encontrar as desvantagens deste método. Os arquivos de configuração foram carregados duas vezes, o que significa que esses feijões foram instanciados duas vezes. A julgar pelas informações impressas, recebemos os grãos que carregamos os arquivos de configuração e fomos instanciados. Este método é obviamente indesejável.
3. Chegue de ServletContext
A partir do método acima, podemos pelo menos saber que a primavera carregou o arquivo de configuração uma vez através de seu ouvinte. Não precisamos carregá -lo novamente. É fácil pensar que, se soubermos onde a primavera foi carregada, podemos obter o arquivo de configuração a partir daí. Vamos dar uma olhada no processo de carregar o arquivo de configuração na primavera:
Na figura acima (o código irrelevante é omitido), o contextLoaderListener é o ouvinte da mola que configuramos no web.xml. Ele também implementa o servletContextListener e herda o carregador de contexto. No ouvinte, o arquivo de configuração é obtido principalmente através do método InitWebApplicationContext e crie um objeto WebApplicationContext. No método InitWebApplicationContext, duas coisas principais são feitas: uma é obter o contexto da primavera e o outro é colocar o contexto da primavera no servletContext, e a chave é: webApplicationContext.root_web_application_context_attrribute. Então, como você obtém o contexto da primavera? É para obter o caminho do Spring configurado em web.xml. Config_Location_Parm é na verdade uma constante de string, que é o seguinte ouvinte de primavera configurado em web.xml:
<Cexexp-Param> <amam-name> contextConfigLocation </param-name> <!-config_location_parm é contextConfigLocation-> <Param-value> ClassPath: beans.xml </param-value> </xectlent-param>
Portanto, é óbvio que você obtém beans.xml através do caminho configurado no web.xml, carregue esse arquivo de configuração e instancie o feijão.
Agora que sabemos que, após a primavera carrega o arquivo de configuração e o coloca no ServletContext, podemos ir aqui e obtê -lo diretamente!
//@componente // ouvinte é um componente da camada da web. É instanciado por Tomcat, não na primavera. Não pode ser colocado na classe pública da primavera initdatalistener implementa servetlextextlistener {private Products Service ProduckerService = null; @Override public void contextDestroyed (Evento ServletContextevent) {// TODO Método Geral Goletomado} @Override public void contextinitialized (ServletContextevent Evento) {// obtenha a classe Logic Consulta Informações do produto // Solução 2: Quando o projeto é iniciado, o arquivo de seleção de lógica. Só precisamos obtê -lo no ServletContext. ApplicationContext context = (ApplicationContext) Event.getServletContext () .getAttribute (webApplicationContext.root_web_application_context_attribute); ProductService = (ProductService) context.getBean ("ProductService"); System.out.println (ProductService); }} Dessa forma, podemos obter o objeto instanciado do produtor. Esse método é bom, mas os parâmetros do getAttribute são muito longos. Não sei se a testa do programador foi cortada naquele momento. Eu acho que ele não conseguia pensar em outros nomes mais adequados ~
4. Carregando a classe de ferramentas fornecida por primavera <r /> talvez os grandes que desenvolveram a primavera também perceberam que o nome desse parâmetro era muito longo, então eles forneceram uma classe de método que pode carregar o arquivo de configuração:
classe pública initdatalistener implementa servletContextListener {Private Productservice ProduckerService = NULL; @Override public void contextDestroyed(ServletContextEvent event) { // TODO Auto-generated method stub } @Override public void contextInitialized(ServletContextEvent event) { // Get business logic class query product information WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); ProductService = (ProductService) context.getBean ("ProductService"); System.out.println (ProductService); }} De fato, o método GetWebApplicationContext aqui apenas encapsula o método acima. Vejamos o código -fonte deste método:
public static webApplicationContext getWebApplicationContext (servletContext sc) {return getwebapplicationContext (sc, webApplicationContext.root_web_application_context_attribute); }Isso é mais conveniente para os programadores chamarem, tudo isso ... então geralmente usamos o terceiro método para obter o arquivo de configuração da Spring, obtendo assim o feijão instanciado correspondente.
Link original: http://blog.csdn.net/eson_15/article/details/51373937
O exposto acima é a solução para o acidente do iPhone 6SPlus WeChat. Espero que seja útil para todos. Espero também que todos apoiem o Wulin.com e prestem mais atenção a um conteúdo mais emocionante no Wulin.com.