1. 程式人生 > >SpringBoot---系統啟動載入實現的幾種方法

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

1.CommandLineRunner 

通過實現介面 CommandLineRunner 來實現,來完成專案啟動就載入所需要的資源。

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

@Component
public class MyProjectRunner implements CommandLineRunner {
 
    @Override
    public void run(String... args) throws Exception {
       //TODO 業務邏輯
    }
 
}

多個 CommandLineRunner介面的例項,如果想改變他們的執行順序可以在實現類上加入  @Order註解

@Order(value=2)

2.ApplicationRunner

通過實現介面 ApplicationRunner來實現,來完成專案啟動就載入所需要的資源。

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
public class MyApplicationRunner implements ApplicationRunner{

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("===MyApplicationRunner==="+ Arrays.asList(args.getSourceArgs()));
        System.out.println("===getOptionNames========"+args.getOptionNames());
        System.out.println("===getOptionValues======="+args.getOptionValues("foo"));
        System.out.println("==getOptionValues========"+args.getOptionValues("developer.name"));
    }
}

3.在過濾器(Filter)和 監聽器(Listener)中載入初始化

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模式是必選屬性)
 */
@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)檔案

使用@WebListener註解,實現ServletContextListener介面

@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銷燬");
    }
 
}

監聽Session的建立與銷燬

@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初始化");
    }
 
}

在啟動主類上加入@ServletComponentScan 註解

4.在SpringBoot主啟動類中巢狀載入初始操作程式碼

@SpringBootApplication
@EntityScan("com.xx.entity")
@EnableTransactionManagement
@EnableCaching
//@EnableAsync //開啟非同步
public class MaobcMain implements WebMvcConfigurer {

    private static final Logger logger= LoggerFactory.getLogger(MaobcMain.class);

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MaobcMain.class, args);
        String[] activeProfiles = run.getEnvironment().getActiveProfiles();
        Arrays.stream(activeProfiles).forEach(profile ->logger.warn("Spring Boot 使用profile為:{}",profile));
        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() {
        //清空本地使用者登陸資訊快取
        RedisUtils.delete(ERedisDomain.TOKEN_LOGIN_USER);
 
        //初始化ES連線池
        ESUtils.initClient();
 
        //啟動系統主執行緒
        SystemThread thread = new SystemThread();
        thread.setDaemon(true);
        thread.start();
    }
}