Listener中@Autowired無法注入的問題


最近在用監聽器的時候遇到了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) {

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM