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 zjcava@163.com
* @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(">>>>>>>>>>>>>>>加载系统配完成 >>>>>>>>>>>>>>>");
}
}