在日常開發中,我們經常會遇到在項目啟動階段要做一些數據初始化等操作,并且隻在項目啟動時進行,後續不再執行。而在SpringBoot2.x中,可根據不同使用場景使用不同的方式去實現該功能。具體如下:
啟動任務常用場景:
/**
* 功能描述: CommandLineRunner實現啟動任務
* @author TuYong
* @date 2022/6/14 14:16
*/
@Component
@Order(100)
@Slf4j
public class InitCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
log.info("讀取String數組參數初始化操作内容...");
}
}
測試結果如下:在 IDEA 中,可以通過如下方式來配置參數
啟動項目後,我們可以看到啟動過程中run方式被執行。
代碼如下,自定義類InitApplicationRunner實現 ApplicationRunner 接口即可。用法同CommandLineRunner一緻,ApplicationRunner 可以接收更多類型的參數(ApplicationRunner 除了可以接收 CommandLineRunner 的參數之外,還可以接收 key/value 形式的參數)。具體獲取參數方法如下:
/**
* 功能描述: ApplicationRunner實現啟動任務
* @author TuYong
* @date 2022/6/14 14:31
*/
@Component
@Order(99)
@Slf4j
public class InitApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
//獲取命令行中的無key參數
List<String> nonOptionArgs = args.getNonOptionArgs();
log.info("InitApplicationRunner無key參數:{}",nonOptionArgs);
//獲取所有key/value形式的參數的key
Set<String> optionNames = args.getOptionNames();
for (String key : optionNames) {
//根據key獲取key/value 形式的參數的value
log.info("InitApplicationRunner有key參數:{}",args.getOptionValues(key));
}
//獲取命令行中的所有參數
String[] sourceArgs = args.getSourceArgs();
log.info("InitApplicationRunner所有參數:{}",Arrays.toString(sourceArgs));
}
}
測試結果如下:在 IDEA 中,可以通過如下方式來配置參數
啟動項目,可以看到控制台打印如下:
定義義一個 ServletContextListener,在contextInitialized方法中進行數據初始化操作即可。
@Component
@Slf4j
public class InitServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//這裡編寫啟動任務代碼
log.info("監聽器初始化.....");
}
}
測試結果如下:
示例代碼如下,被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,并且隻會被服務器執行一次。創建bean的時候執行順序Constructor(構造方法) -> @Autowired(依賴注入) -> @PostConstruct(注釋的方法)
需要注意的是:
/**
* 功能描述: 基于@PostConstruct實現啟動任務
* @author TuYong
* @date 2022/6/14 14:59
*/
@Service
@Slf4j
public class SysParamService {
@PostConstruct
public void initParam(){
//編寫業務邏輯代碼,比如從數據庫查詢系統參數放入緩存中
log.info("初始化系統參數......");
}
}
測試結果如下
示例代碼如下:
/**
* 功能描述: 基于InitializingBean實現啟動任務
* @author TuYong
* @date 2022/6/14 15:25
*/
@Component
@Slf4j
public class MyInitializingBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
//編寫啟動任務代碼
log.info("InitializingBean 執行初始化任務...");
}
}
測試結果如下
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!