1. 程式人生 > >SpringBoot實踐之---系統啟動載入實現的幾種方法init、servelt、CommandLineRunner

SpringBoot實踐之---系統啟動載入實現的幾種方法init、servelt、CommandLineRunner

實際應用中,我們會有在專案服務啟動的時候就去載入一些資料或做一些事情這樣的需求。

 方法一:CommandLineRunner 

為了解決這樣的問題,Spring Boot 為我們提供了一個方法,通過實現介面 CommandLineRunner 來實現。

很簡單,只需要一個類就可以,無需其他配置。 
建立實現介面 CommandLineRunner 的類

package org.springboot.sample.runner;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * 服務啟動執行
 *
 * @author
單紅宇(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年1月9日 */
@Component public class MyStartupRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作<<<<<<<<<<<<<"
); } }

Spring Boot應用程式在啟動後,會遍歷CommandLineRunner介面的例項並執行它們的run方法。也可以利用@Order註解(或者實現Order介面)來規定所有CommandLineRunner例項的執行順序。

如下我們使用@Order 註解來定義執行順序。

package org.springboot.sample.runner;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 服務啟動執行
 *
 * @author
單紅宇(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年1月9日 */
@Component @Order(value=2) public class MyStartupRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作 11111111 <<<<<<<<<<<<<"); } }
package org.springboot.sample.runner;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 服務啟動執行
 *
 * @author   單紅宇(365384722)
 * @myblog  http://blog.csdn.net/catoop/
 * @create    2016年1月9日
 */
@Component
@Order(value=1)
public class MyStartupRunner2 implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作 22222222 <<<<<<<<<<<<<");
    }

}

啟動程式後,控制檯輸出結果為:

>>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作 22222222 <<<<<<<<<<<<<
>>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作 11111111 <<<<<<<<<<<<<

根據控制檯結果可判斷,@Order 註解的執行優先順序是按value值從小到大順序。

方法二:在過濾器(Filter)和 監聽器(Listener)中載入初始化

過濾器(Filter)檔案

MyFilter.java

package org.springboot.sample.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * 使用註解標註過濾器
 * @WebFilter將一個實現了javax.servlet.Filter介面的類定義為過濾器
 * 屬性filterName宣告過濾器的名稱,可選
 * 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性)
 * 
 * @author   單紅宇(365384722)
 * @myblog  http://blog.csdn.net/catoop/
 * @create    2016年1月6日
 */
@WebFilter(filterName="myFilter",urlPatterns="/*")
public class MyFilter implements Filter {

    @Override
    public void destroy() {
        System.out.println("過濾器銷燬");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("執行過濾操作");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println("過濾器初始化");
    }

}

ServletContext監聽器(Listener)檔案

MyServletContextListener.java

package org.springboot.sample.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * 使用@WebListener註解,實現ServletContextListener介面
 *
 * @author   單紅宇(365384722)
 * @myblog  http://blog.csdn.net/catoop/
 * @create    2016年1月6日
 */
@WebListener
public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContex初始化");
        System.out.println(sce.getServletContext().getServerInfo());
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContex銷燬");
    }

}

ServletContext監聽器(Listener)檔案

MyHttpSessionListener.java

package org.springboot.sample.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 監聽Session的建立與銷燬
 *
 * @author   單紅宇(365384722)
 * @myblog  http://blog.csdn.net/catoop/
 * @create    2016年1月6日
 */
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Session 被建立");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("ServletContex初始化");
    }

}

注意不要忘記在 SpringBootSampleApplication.java 上新增 @ServletComponentScan 註解。

在啟動的過程中我們會看到輸出:

ServletContex初始化
Apache Tomcat/8.0.30
過濾器初始化

方法三:在SpringBoot主啟動類中巢狀載入初始操作程式碼

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ImportResource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication(scanBasePackages={"com.ceiec"})
@EnableTransactionManagement
@EnableCaching
@ImportResource("classpath:consumer.xml")
public class WebInsightApplication {

	public static void main(String[] args) {
		SpringApplication.run(WebInsightApplication.class, args);
		SystemInit.init();
	}

}
 實際載入類
public class SystemInit {

    /** 記錄使用者每次請求時間:key為userId,value為請求時間毫秒值 */
    private static Map<String, Object> requestTime = new HashMap<String, Object>();

    public static Map<String, Object> getRequestTime() {
        return requestTime;
    }

    /**
     * 系統初始化
     */
    public static void init() {
        //清空本地使用者登陸token快取
        RedisUtils.delete(ERedisDomain.TOKEN_LOGIN_USER);

        //初始化ES連線池
        ESUtils.initClient();

        //啟動系統主執行緒
        SystemThread thread = new SystemThread();
        thread.setDaemon(true);
        thread.start();
    }
}

相關推薦

SpringBoot實踐---系統啟動載入實現方法initserveltCommandLineRunner

實際應用中,我們會有在專案服務啟動的時候就去載入一些資料或做一些事情這樣的需求。 方法一:CommandLineRunner 為了解決這樣的問題,Spring Boot 為我們提供了一個方法,通過實現介面 CommandLineRunner 來實現。很簡單,只需要一個類就可以

SpringBoot---系統啟動載入實現方法

1.CommandLineRunner  通過實現介面 CommandLineRunner 來實現,來完成專案啟動就載入所需要的資源。 import org.springframework.boot.CommandLineRunner; import org.springfra

js實現延遲載入方法

js的延遲載入有助與提高頁面的載入速度,以下是延遲載入的幾種方法: 使用setTimeout延遲方法的載入時間 延遲載入js程式碼,給網頁載入留出更多時間 <script type="text/javascript" > function A(){

SpringBoot中資源初始化載入方式(看這一片就夠了)

一、問題   在平時的業務模組開發過程中,難免會需要做一些全域性的任務、快取、執行緒等等的初始化工作,那麼如何解決這個問題呢?方法有多種,但具體又要怎麼選擇呢? 二、資源初始化 1、既然要做資源的初始化,那麼就需要了解一下springboot啟動過程(這裡大體說下啟動過程,詳細:https://www.cnb

javaMap集合遍歷方法

package cn.com.javatest.collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * java之Map集合遍歷幾種方法 * * @author:

selenium中關於停止載入方法

進行頁面跳轉時,或開啟網頁時,遇到某一個資源找不到,頁面一直處於載入中,python後續程式碼無法執行, 1. 通過Python win32api鍵按下ESC中斷瀏覽器載入 具體參考selenium 自動化中斷瀏覽器載入,加快自動化與執行速度這邊文章, 相關連結: htt

Linux開機自動載入方法

linux 新增開機啟動項的三種方法。 (1)編輯檔案 /etc/rc.local 輸入命令:vim /etc/rc.local 將出現類似如下的文字片段: #!/bin/sh #This script will be executed after all the other init scripts

路由元件按需載入方法

 在Vue專案中,一般使用vue-cli構建專案後,我們會在Router資料夾下面的index.js裡面引入相關的路由元件,如: import Hello from '@/components/Hello' import Boy from '@/components/Boy

ok6410開發板的andriod系統下裝apk的方法整理

如果安裝了eclipse,併成功安裝ADT外掛,啟動eclipse中的DDMS,在File Explore中可以檢視到檔案系統,右上角有兩個圖示,一個是push a file onto the device另一個是pull a file from the device,點push a file onto t

IOS開發延時執行的方法

1.最直接的方法performSelector:withObject:afterDelay: 這種方法的缺點:每次要為延時寫一個方法 2.使用類別,用BOLCK執行 [程式碼]c#/cpp/oc程式碼: 01 @implementation NSObje

為樹莓派/香蕉派做系統備份映象的方法

1.使用WinHex1)使用WinHex開啟裝有系統的SD卡。 注意: {如果你原來備份過SD的IMG,用winhex開啟備份的img,可以進行修改,擴充,縮小等操作。} 2)點工具,將SD卡的0到1

Android 禁止Edittext彈出系統軟鍵盤 的方法

第一種方法:在XML檔案下新增: android:focusable="true" android:focusableInTouchMode="true" 第二種方法:直接關閉輸入法 在onC

WPF Data Binding指定源(Source)的方法【三】

    Binding的源是資料的來源,所以,只要一個物件包含資料並且能夠通過屬性將資料暴露出來,它就能當作Binding的源來使用。包含資料的物件比比皆是,但必須為Binding的Source指定合

oracle啟動/停止的方法以及 啟動和停止過程中出錯的解決辦法

一、啟動幾種方法: 1、 sqlplus /nolog connect /as sysdba startup 2、 sqlplus /nolog connect /as sysdba startup nomount alter database mount alter database o

python 執行shell命令的方法(os.systemos.popensubprocesscommands)

1、os.system 該函式返回命令執行結果的返回值,並不是返回命令的執行輸出, system()函式在執行過程中進行了以下三步操作: 1.fork一個子程序; 2.在子程序中呼叫exec函式去執行命令; 3.在父程序中呼叫wait(阻塞)去等待子程序結

對比三維空間旋轉的方法——尤拉角繞軸的旋轉矩陣四元數雙四元數

三維空間的旋轉可以用尤拉角,旋轉矩陣,軸-角,四元數,雙四元數來表示,本文主要總結這些表示方法的優缺點。像矩陣、四元數等的實現的下載地址,可以參考這裡,也可以參考Ogre渲染引擎的核心,都有很高效的實現方法。 一.  尤拉角(Euler-Angles) 1.1    介紹 尤拉角包括3個旋轉,根據這

MyEclipse10安裝Svn外掛的方法及解除安裝問題

5、重啟myeclipse就一切正常了。附:解除安裝方法採用link方式,刪掉link就可以,採用線上更新安裝的,刪除掉workspaces/.metadata/.plugins 下帶有subversion字樣的資料夾即可。問題解決: 關於myeclipse10.7外掛安裝Personal Site 新增後無

SSH框架---實現系統啟動載入類,讀取資料庫常用資料進入記憶體以及將資料放在application

如果想讓bean類在初始化時啟動某個方法,在xml裡設定<bean id="test" class="xxx.xxx.Test" init-method="init"></bean> 或者使用annotation在方法上配置@PostConstruct即可。 但如果bean類設定為s

Celery學習--- Celery 最佳實踐與django結合實現異步任務

tar load modules bin min sta 版本差異 status linux django 可以輕松跟celery結合實現異步任務,只需簡單配置即可 同步執行和異步執行 註意:即使Celery的任務沒有執行完成,但是已經創建了任務ID。可以利用前臺的定時

linux操作系統啟動流程,實現kickstart文件制作與光盤鏡像制作

spl enc 圖片 登錄 交互式 引導啟動 system 內核模塊 ini 1、 簡述linux操作系統啟動流程 POST:通電自檢; BIOS:BOIS自檢,加載硬盤; 讀取MBR,進行MBR引導; bootloader:grub引導菜單; 加載內核 Kernel(