第一步、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()); } }