JAVA Spring MVC Thread 解決自動注入問題


在Spring MVC中我們往往想要程序初始化的時候就能啟動某一個線程來做某些工作,具體步驟如下:

  1,在Spring MVC中想要啟動某個class下的方法,在web.xml文件中這樣配置,在啟動server時默認地會執行

 

    <servlet>
    <servlet-name>InitServlet</servlet-name>
    <servlet-class>com.siemens.wos.wp3.dapf.startup.InitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

 

  2,我們將線程的start()函數寫在InitServlet類中

    


    private ServerStatusWatcherThread serverstatusmonitorThread;

    public final void init() throws ServletException {

      //Start ServerStatusWatcher Thread
      if (serverstatusmonitorThread == null) {
        serverstatusmonitorThread = new ServerStatusWatcherThread();
        serverstatusmonitorThread.start();
       }

     }

 

  3,繼承Thread類,重寫run()方法

 

    public class ServerStatusWatcherThread extends Thread {

      @Override 

      public void run(){

          //what do you want to do please write here

      }

    }


 
 4,如果想要在run()方法中調用dao層或者service層,常規的方法應該是這樣

    public class ServerStatusWatcherThread extends Thread {

      

      @Resource(name="servermanageDao")
      ServerManagementMapper servermanageDao;

      @Autowired
      ServerManagementService serverservice;

 

      @Override 

      public void run(){

          List<ServerManagementItem> servers =servermanageDao.getAll();

          

          serverservice.QuerySOSServer();

          //what do you want to do please write here

      }

    }

 

    結果會報如下異常:Exception in thread "Thread-3" java.lang.NullPointerException

 

  5,解決方法可以用getBean的方式來解決這個問題,異常解決

  

    public class ServerStatusWatcherThread extends Thread {

      

      //@Resource(name="servermanageDao") 
      //ServerManagementMapper servermanageDao;

      //改成

      ServerManagementMapper  servermanageDao=(ServerManagementMapper) SpringContextUtil.getBean("servermanageDao");

 

      //@Autowired
      //ServerManagementService serverservice;

      //改成:

      ServerManagementService servemanagementService=(ServerManagementService) SpringContextUtil.getBean("servemanagementService");

 

      @Override 

      public void run(){

          List<ServerManagementItem> servers =servermanageDao.getAll();

          

          serverservice.QuerySOSServer();

          //what do you want to do please write here

      }

    }

 


免責聲明!

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



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