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