第一步、web.xml 配置web
<listener> <listener-class>com.jeeplus.modules.sys.listener.WebContextListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <!-- 自定义listener 必须配置放在 ContextLoaderListener 以后--> <listener> <listener-class>com.jeeplus.modules.sys.listener.MyContextListener</listener-class> </listener>
第二步、自定义 listenerspring
public class MyContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("=========自定义 listenr======="); //注入 AnsCustBasicDao ,不能经过 注解方式注入 AnsCustBasicDao ansCustBasicDao= WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(AnsCustBasicDao.class); AnsCustBasic ansCustBasic= ansCustBasicDao.get("1d225dd66ca64f34a9ef272b2ce589ae"); System.out.println("在自定义 listen 中获取用户信息:"+ansCustBasic.toString()); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }
注意:在自定义 listener 中若是须要使用 spring 容器中的 bean ,不能够直接 @Autowired tomcat
(1) Listener的生命周期是由servlet容器(例如tomcat)管理的,项目启动时上例中的ConfigListener是由servlet容器实例化并调用其contextInitialized方法,而servlet容器并不认得@Autowired注解,所以致使ConfigService实例注入失败ide
(2) 而spring容器中的bean的生命周期是由spring容器管理的工具
这就须要用到spring为咱们提供的WebApplicationContextUtils工具类,该工具类的做用是获取到spring容器的引用,进而获取到咱们须要的bean实例。xml
若是只是做为自定义启动类的话,还有另一种方法,就是 实现 InitializingBean 接口,重写其中的方法 afterPropertiesSet( ),实现效果是同样接口
@Component public class MyContextListener2 implements InitializingBean { @Autowired private AnsCustBasicDao ansCustBasicDao; @Override public void afterPropertiesSet() throws Exception { System.out.println("自定义 listener 实现 InitializingBean 接口"); AnsCustBasic ansCustBasic= ansCustBasicDao.get("1d225dd66ca64f34a9ef272b2ce589ae"); System.out.println("自定义 listener 实现 InitializingBean 接口获取用户信息:"+ansCustBasic.toString()); } }