最近在用監聽器的時候遇到了spring無法注入的問題,代碼如下,這個task總是null,包明明已經被掃到了,就是注入不進來。
public class MyListener implements ServletContextListener {
@Autowired private TaskThread taskThread; @Override public void contextInitialized(ServletContextEvent sce) { task.doThread0(); } @Override public void contextDestroyed(ServletContextEvent sce) { } }
原因如下:在Listener監聽器中無法使用Spring容器的@Resource或者@Autowired 注解的方法注入bean,因為,在web Server容器中,無論是Servlet,Filter,還是Listener都不是Spring容器管理的,因此我們都無法在這些類中直接使用Spring注解的方式來注入我們需要的對象。在這里,Servlet的整個生命周期都是由Servlet容器來處理的。如果把它硬放到Spring容器中去創建,Servlet對象是可被Spring容器建出來,但Servlet容器可能跟本就不知道這個Servlet是否存在,因為不在它自己的容器中。所以,servlet交給web server來管理,不要交給spring管理。
做如下修改:
從spring的上下文中獲取,完美解決了問題。
public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext()); TaskThread task = context.getBean(TaskThread.class); task.doThread0(); } @Override public void contextDestroyed(ServletContextEvent sce) { } }