1. 程式人生 > >SpirngMVC系統啟動系統配置初始化執行順序以及防止onApplicationEvent執行兩次

SpirngMVC系統啟動系統配置初始化執行順序以及防止onApplicationEvent執行兩次

Spirng系統啟動容器執行順序

這裡面加入了springMVC,因此基本的啟動執行後用到的過載方法都列出來了,下面的logger.info中給出了前後執行的順序次序,可以根據自己的需求進行修改,但是這個時候,會存在一個問題onApplicationEvent方法被執行兩次,在web 專案中(spring mvc),系統會存在兩個容器,一個是root application context ,另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)。

這種情況下,就會造成onApplicationEvent方法被執行兩次。為了避免上面提到的問題,我們可以只在root application context初始化完成後呼叫邏輯程式碼,其他的容器的初始化完成,則不做任何處理,修改後程式碼



import java.util.List;

import javax.servlet.ServletContext;

import org.apache.commons.lang3.Validate;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory
.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent
; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.context.ServletContextAware; import com.xialeme.common.core.config.Global; /*********** * 系統啟動初始化引數 * @author bamboo [email protected] * @time 2017-10-17 */ @Service @Component public class InItSystemParam implements ApplicationContextAware, ServletContextAware, InitializingBean,ApplicationListener<ContextRefreshedEvent> { @Autowired private RedisTemplate redisTemplate; @Autowired private SysParamDao sysParamDao; private static Logger logger = LoggerFactory.getLogger(InItSystemParam.class); @Override public void setApplicationContext(ApplicationContext ctx) throws BeansException { logger.info("1 => StartupListener.setApplicationContext"); } @Override public void setServletContext(ServletContext context) { logger.info("2 => StartupListener.setServletContext"); } @Override public void afterPropertiesSet() throws Exception { logger.info("3 => StartupListener.afterPropertiesSet"); } @Override public void onApplicationEvent(ContextRefreshedEvent event) { //redisTemplate=getBean(RedisTemplate.class); logger.info("4.1 => MyApplicationListener.onApplicationEvent"); //在web 專案中(spring mvc),系統會存在兩個容器,一個是root application context ,另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)。 //這種情況下,就會造成onApplicationEvent方法被執行兩次。為了避免上面提到的問題,我們可以只在root application context初始化完成後呼叫邏輯程式碼 if(event.getApplicationContext().getParent() == null){ initSysParam();////初始化系統配置引數 } logger.info("4.1 => "+ event.getApplicationContext().getParent()+":"+event.getApplicationContext().getDisplayName()); if (event.getApplicationContext().getParent() == null) { logger.info("4.2 => MyApplicationListener.onApplicationEvent"); // operations = redisTemplate.opsForValue(); // System.out.println(operations.get("test_cccccc")); } else { logger.info("4.4 => "+event.getApplicationContext().getParent().getDisplayName()); } if (event.getApplicationContext().getDisplayName() .equals("Root WebApplicationContext")) { logger.info("4.3 => MyApplicationListener.onApplicationEvent"); } } //初始化系統配置引數 public void initSysParam() { logger.info(">>>>>>>>>>>>>>>服務啟動執行,執行載入系統配置資料 <<<<<<<<<<<<<"); SysParam p=new SysParam(); p.setIsDeleted(0); p.setIsConfigurable(1); List<SysParam> sysParamList =sysParamDao.getList(p); /** 網易雲信分配的賬號***/ YunxinSms.SMS_APP_KEY =Global.getConfig("SMS_APP_KEY");// logger.info(">>>>>>>>>>>>>>>載入系統配完成 >>>>>>>>>>>>>>>"); } }

相關推薦

SpirngMVC系統啟動系統配置初始執行順序以及防止onApplicationEvent執行

Spirng系統啟動容器執行順序 這裡面加入了springMVC,因此基本的啟動執行後用到的過載方法都列出來了,下面的logger.info中給出了前後執行的順序次序,可以根據自己的需求進行修改,但是這個時候,會存在一個問題onApplicationEvent

①操作系統安裝流程及初始規範

①操作系統安裝流程及初始化規範v1.0-陳泰成-20180306v1.1-陳泰成-20180320 操作系統安裝流程 1 ) 調用cobbler-api安裝操作系統2 ) 調用saltstack-api進行系統初始化3 ) 調用dns-api解析主機名4 ) 調用zabbix-api對該

操作系統安裝安裝及初始規範

系統安裝流程操作系統安裝安裝及初始化規範 V2.0 操作系統安裝流程 服務器采購 服務器驗收並設置raid 服務商提供驗收單,運維驗收負責人簽字 服務器上架 資產錄入 開始自動化安裝 將新服務器劃入裝機vlan 根據資產清單上的mac地址,自定義安裝。 1、機房 2、機房區域 3、機櫃 4、服務器位置

從零到實戰:React無人點餐收銀系統教程(1)專案初始

react官網:react官網 React的介紹: React來自於Facebook公司的開源專案 React 可以開發單頁面應用       spa(單頁面應用) react 元件化模組化  開發模式 React通過對DOM的模擬(虛

Linux 網路系統學習 IPv6 的初始(詳細而全面)

struct  proto_ops {              int                      family;              struct  module     * owner;              int              

SpringMVC源碼解析-DispatcherServlet啟動流程和初始

instant custom delegate bean 自己的 erro -- true long 在使用springmvc框架,會在web.xml文件配置一個DispatcherServlet,這正是web容器開始初始化,同時會在建立自己的上下文來持有Spring

Java中的初始塊和構造器的執行順序

我們都知道java中不但有構造器,還有初始化塊和靜態初始化塊的概念,今天我們就來看看他們之間的執行順序是怎樣的。 我們來看一個例子: package test; class Root { static { System.out.println("Root的靜態初始化塊"); }

linux個性化配置初始指令碼

#!/bin/bash #==================================================== # Author: Mr.Song # Create Date: 2018-11-16 # Description: #=============================

linux個性化配置初始腳本

dev ++ hosts mct The top eof bash 賬戶 #!/bin/bash #==================================================== # Author: Mr.Song # Create Date: 2

Android wpa_supplicant原始碼分析--啟動之全域性初始

1. wpa_supplicant簡介 wpa_supplicant是用來用來支援無線中各種加密方式的,包括WEP、WPA/WPA2和WAPI(中國特有)、EAP(8021x)。wpa_s通過socket與上層(framework)和底層(driver)通訊,向上接收命令和傳

linux核心啟動中的初始

                轉自 http://blog.csdn.net/mayaoyao11/article/details/6636977 【問題】 此處我要實現的是將晶片的ID用於網絡卡MAC地址,網絡卡驅動是enc28j60_init。 但是,讀取晶片ID的函式,在as352x_afe

spring配置順序決定了類被初始順序

spring的配置順序是one,compoent-scan(three類被配置了@component標籤,會被他掃描到並自動配置進來),two。 類Three的配置@Component,所以在spring配置了Component-scan掃描器以後就可以自動被

Nginx 配置初始過程

nginx解析配置檔案,將解析出來得配置存放在ngx_cycle_s的conf_ctx中,conf_ctx是個四級指標,因為儲存這些配置需要context,而這些context是有層級關係,最終的配置結構如圖: http模組的配置有些複雜,由於server的配置還可以

java執行過程,初始順序,建構函式,變數作用域,反射機制,面向物件的特徵

java是解釋性語言 執行過程:程式原始碼經過java編譯器編譯成位元組碼,然後由JVM解釋執行。 Java源程式經過編譯器編譯後變成位元組碼,位元組碼由虛擬機器解釋執行,虛擬機器將每一條要執行的位元組碼送給直譯器,直譯器將其翻譯成特定機器上的機器碼,然後在特定的機器上執

---串列埠的配置初始函式------------------

#include <stdio.h> #include <stdlib.h> #include <termio.h> #include <unistd.h> #include <fcntl.h> #includ

spring 框架,載入靜態變數配置; 初始靜態變數, 載入配置檔案

1:普通變數的屬性變數載入  import java.io.InputStream; import java.util.Properties; import org.apache.commons.lang.StringUtils; import org.slf4j.Log

資源注射與Servlet配置初始引數

 在進行web開發時,我們有時候需要把一些常量資訊寫在某個配置檔案中,這樣這個常量改變的時候,只要改變配置檔案裡的值就可以了。這時候就要用到配置初始化引數: 我寫了一個簡單的例子: <servlet> <servlet-name>GetKey<

關於spring boot 的啟動載入 一些初始資料

方法一: 如何載入一些啟動就需要的初始化資料呢? 為了解決這樣的問題,spring Boot 為我們提供了一個方法,通過實現介面 CommandLineRunner 來實現。無需其他配置,只要建立

SpringBoot啟動過程之初始器initializer和監聽器listeners

Listener類圖SpringApplication構造的時候內部會呼叫一個private方法initialize:public SpringApplication(Object... sources) { initialize(sources); // sources目前

Spring配置初始ApplicationContext

1. 在struts-config.xml裡,以外掛的形式 xml 程式碼 <plug-inclassName="org.springframework.web.struts.ContextLoaderPlugIn" / > <set-pro