1. 程式人生 > >spring boot啟動時載入系統資料的方法

spring boot啟動時載入系統資料的方法

有時候我們需要在應用啟動或者重啟後做一些工作,比如刪除一些臨時檔案或者Redis中的快取,這在沒有使用Spring Boot之前,在Spring框架下是通過ApplicationListener監聽器來實現的,在Spring Boot下也有一些辦法,可以通過使用CommandLineRunnerApplicationRunner介面來實現。

在這兩個介面中都有run()方法,在Spring Boot程式啟動後會檢測程式中是否有CommandLineRunnerApplicationRunner介面的例項,如果存在,則會執行對應實現類中的run()方法,而且只執行一次。

Spring Boot程式啟動過程中會例項化ApplicationContext

,然後建立所有的Bean。

如果存在多個CommandLineRunnerApplicationRunner介面的例項,那麼它們的執行順序可以通過@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後執行。

關於CommandLineRunnerApplicationRunner的區別,在官方文件中是這麼說的:

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 the Ordered 
interface or @Order annotation. 
If you need access to ApplicationArguments instead of the raw String array consider using ApplicationRunner.