spring boot啟動時載入系統資料的方法
有時候我們需要在應用啟動或者重啟後做一些工作,比如刪除一些臨時檔案或者Redis
中的快取,這在沒有使用Spring Boot
之前,在Spring框架下是通過ApplicationListener
監聽器來實現的,在Spring Boot
下也有一些辦法,可以通過使用CommandLineRunner
和ApplicationRunner
介面來實現。
在這兩個介面中都有run()方法,在Spring Boot程式啟動後會檢測程式中是否有CommandLineRunner
和ApplicationRunner
介面的例項,如果存在,則會執行對應實現類中的run()方法,而且只執行一次。
Spring Boot程式啟動過程中會例項化
ApplicationContext
,然後建立所有的Bean。
如果存在多個CommandLineRunner
和ApplicationRunner
介面的例項,那麼它們的執行順序可以通過@Order
註解和Ordered
介面來標識,數字越小,優先順序越高。
看如下例項:
TaskRunner類:
public class TaskRunner implements ApplicationRunner, Ordered { private static final Logger logger = LoggerFactory.getLogger(TaskRunner.class); @Override public int getOrder() { return 2; } @Override public void run(ApplicationArguments args) throws Exception { logger.info("task runner"); } }
StartupRunner類:
@Order(1) public class StartupRunner implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(StartupRunner.class); @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired @Qualifier("secondaryDataSource") private DataSource secondDataSource; @Override public void run(String... args) throws Exception { logger.info("startup runner"); System.out.print(primaryDataSource.getConnection().getMetaData().getURL()); System.out.print(secondDataSource.getConnection().getMetaData().getURL()); } }
然後在Application主類中定義這兩個bean,由於@SpringBootApplication
註解中包含@Configuration
註解,所以@Bean註解在其中也會起作用,如下:
@SpringBootApplication
public class SpringBootTemplateApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootTemplateApplication.class, args);
}
@Bean
public StartupRunner startupRunner(){
return new StartupRunner();
}
@Bean
public TaskRunner taskRunner(){
return new TaskRunner();
}
}
輸出如下:
可以看出由於StartupRunner
類優先順序較高所以先執行,TaskRunner
後執行。
關於CommandLineRunner
和ApplicationRunner
的區別,在官方文件中是這麼說的:
Interface used to indicate that a bean should run when it is contained within
a SpringApplication. Multiple CommandLineRunner beans can be defined
within the same application context and can be ordered using theOrdered
interface or@Order
annotation.
If you need access to ApplicationArguments instead of the raw String array consider using ApplicationRunner.