import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
*
* @author AshtarEve
*
* @version 1.0
*
* @date 2016年11月17日--下午5:55:29
*
* @Description 实现应用初始化的时候,注入给应用上下文一些初始的公共数据<br>
* !!这个类实际上是实例化两次,在listener一次,spring容器里又实例化一次,<br>
* !!但是Spring中实例化是为了执行setApplicationContext来给静态的applicationContext赋值,否则这个注入方法是不会被执行的<br>
* !!可以说这个注入方案是可以新建一个类实现的,符合面向对象思想,但是简单起见,直接这么玩也可以<br>
* !!执行顺序:listener->spring容器给listener属性初始化->执行listener的contextInitialized方法
*
*/
@WebListener
@Component
public class InitListener implements ServletContextListener, ApplicationContextAware {
private static ApplicationContext applicationContext;
public InitListener() {
System.out.println("con");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("注入");
InitListener.applicationContext = applicationContext;
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
System.out.println(applicationContext == null);
}
}
执行顺序:listener->spring容器给listener属性初始化->执行listener的contextInitialized方法
执行结果(略去日志部分):
con——web容器初始化时的listener构造方法执行
con——spring容器初始化时listener构造方法执行
注入——执行setApplicationContext方法
false——得到spring的applicationContext对象不为空