web項目啟動時,自動執行代碼的幾種方式


在項目開發過程中,往往需要一些功能隨着項目啟動而優先啟動,下面我總結幾種方式(非spring boot) spring boot的參考 spring boot 學習之路9 (項目啟動后就執行特定方法)

 


 

方式一:   ServletContextListener監聽器,不懂監聽器的可以去網上百度一下servlet的監聽器

  

java 代碼如下:

package com.deifeng.huhy.common.run; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory;
public class RunStartOne implements ServletContextListener { private static final Logger LOGGER = LoggerFactory.getLogger(RunStartOne.class); public RunStartOne() {} public void contextDestroyed(ServletContextEvent arg0) {} public void contextInitialized(ServletContextEvent arg0) { try { // 需要實現的功能 System.out.println("隨項目啟動方式一----------------》"); } catch (Exception e) { LOGGER.error("GreyClientInitListener error", e); } } }

web.xml配置如下:
  
<listener><listener-class>com.deifeng.huhy.common.run.RunStartOne</listener-class></listener>
項目啟動如下:
  

 

 
        

方式二:  ApplicationListener

 

  

代碼實現如下:
package com.deifeng.huhy.common.run;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;

@Service
public class RunStartTwo implements ApplicationListener<ContextRefreshedEvent> {
  private static final Log LOGGER = LogFactory.getLog(RunStartTwo.class);
  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    try {
      // 在web項目中(spring mvc),系統會存在兩個容器,一個是root application context
      // ,另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)。
      // 這種情況下,就會造成onApplicationEvent方法被執行兩次。為了避免這個問題,我們可以只在root
      // application context初始化完成后調用邏輯代碼,其他的容器的初始化完成,則不做任何處理。
      if (event.getApplicationContext().getParent() == null) {
        // 需要實現的功能
        System.out.println("隨項目啟動方式二----------------》");
      }
    } catch (Exception e) {
      LOGGER.error("StartGateServiceData", e);
    }
  }
}

啟動成功如下:
  

 

 

 方式三:extends HttpServlet

  

代碼實現:
    public class RunStartThree extends HttpServlet {
      // Servlet的init方法會在Tomcat啟動的時候執行
      public void init() throws ServletException {
      // 需要實現的功能
          System.out.println("隨項目啟動方式三--------------》");
      }
}


web.xml的配置:
    <servlet>
          <servlet-name>init</servlet-name>
          <servlet-class>com.deifeng.huhy.common.run.RunStartThree</servlet-class>
          <load-on-startup>1</load-on-startup>
    </servlet>
注意: 有人會問為啥不配servlet-map 簡單解釋一下,這個功能是隨着項目啟動而啟動,我不允許有url能訪問到,所以在這就沒配置,如果你配上也沒問題,不會保錯,為了代碼的安全性,我就不配做url的映射了


啟動項目成功如圖:
  

 

 
        

 

 

到這,還沒結束,不知道有沒有人會思考,這三種啟動方式有沒有先后啊:現在代碼都有了,我就在這測一下------------------------------------

  現在我把三種方式都放開:啟動項目我們看日志記錄就行了

  applicaton      >       listener    > httpServlet

  

 

  分析:

    這個優先順序和servlet容器有關,如果你研讀過servlet的源碼,

    1.web項目中(spring mvc),系統會存在兩個容器,一個是root application context。另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)。這種情況下,就會造成onApplicationEvent方法被執行兩次。為了避免這個問題,我們可以只在root application context初始化完成后調用邏輯代碼,其他的容器的初始化完成,則不做任何處理。【對應於方式二】

    2.系統容器,是root在先  然后就是項目容器,對於servelt的加載順序   監聽器》過濾器 》servlet  的加載機制,所以造成上面那張啟動順序,有時間可以看看servlet源碼

    

 

 


免責聲明!

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



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