listener中注入spring实例null问题。

工作中遇到记一下,需求:监听器中启动一个线程,监听某个端口号。

在使用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

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);

	
	}

}

这样解决了这个问题! 


版权声明:本文为qq_36862445原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。