@Component @Lazy(false) public class ContextListener implements ApplicationContextAware, ApplicationContextInitializer, ApplicationListener<ApplicationContextEvent> {
private static final Logger loginIpRecordLogger = LoggerFactory.getLogger("loginIpRecordLogger");
@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { loginIpRecordLogger.info("cccc" + applicationContext); WebContextUtils.setAc(applicationContext); }
@Override public void initialize(ConfigurableApplicationContext applicationContext) { loginIpRecordLogger.info("dddd" + applicationContext); WebContextUtils.setAc(applicationContext); }
@Override public void onApplicationEvent(ApplicationContextEvent event) { loginIpRecordLogger.info("eeee" + event.getApplicationContext()); WebContextUtils.setAc(event.getApplicationContext()); } }
ApplicationContextInitializer对应initialize(),最早,在spring初始化开始就获得了。 ApplicationContextAware对应setApplicationContext(), ApplicationListener<ApplicationContextEvent>对应onApplicationEvent(), 这俩差不多,查一两秒,大概是在spring初始化完成的时候。
------------------------- ApplicationContextInitializer需要在web.xml里添加: <context-param> <param-name>contextInitializerClasses</param-name> <param-value>cn.xxxx.yyyy.ContextListener</param-value> </context-param> 手动指定。 ------------------------- 注意,ApplicationListener<ApplicationContextEvent>这个会触发两次, 分别对应Root WebApplicationContext和WebApplicationContext, 也就是spring和spring mvc两个,后者的parent是前者。 应该判断parent==null时,也就是前者时,再保存context。
不过,这个比ApplicationContextAware晚几秒,所以干脆就别用它了。 --------------------------
|