工作中遇到记一下,需求:监听器中启动一个线程,监听某个端口号。
在使用service接口或者dao接口注入为空。
原因:
(1)Listener的生命周期是由servlet容器(例如tomcat)管理的,项目启动时上例中的ConfigListener是由servlet容器实例化并调用其contextInitialized方法,而servlet容器并不认得@Autowired注解,因此导致ConfigService实例注入失败。
(2)而spring容器中的bean的生命周期是由spring容器管理的。
解决方法:
1
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.blue.controller.MyListener</listener-class>
</listener>
顺序!顺序!顺序! 先加载spring
2 spring为我们提供的WebApplicationContextUtils工具类,该工具类的作用是获取到spring容器的引用,进而获取到我们需要的bean实例
public class MyListener implements ServletContextListener{
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
UpService service = WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()).getBean(UpService.class);
}
}
这样解决了这个问题!